`

【编程珠玑】第十一章 排序 (插入排序和快速排序的深度优化)

 
阅读更多

一,概述

1)插入排序

要找到合适的位置,需要判断前一个元素比t小而后一个元素比t大。然后将t插入正确位置。

比较a[j-1] 跟 a[j] 的关系很关键


isort1: 没有到达最终位置,就交换该元素和它前面的元素

#include <algorithm>

  isort2:将库函数替换


isort3:减少移动次数



 2)快速排序
  qsort1:O(nlog(n)时间和O(logn)的栈空间


qsort2:双向划分避免所有元素都相等时候的最坏情况



思路:n个相同元素组成的数组,插入排序性能最好(每个元素需要移动的距离都为0),时间复杂度为o(n)。 快速排序的性能则很糟糕,n-1次划分每次划分都需要0(n)的时间来去掉一个元素,所以时间复杂度为O(n*n) 采取的对策是:采取两个内循环,第一个向右移过小元素,遇到大元素停止,第二个左移,遇到小元素停止。然后交换。 当遇到相同的元素时,停止扫描,交换a[i] 和 a[j]的值。最坏时间复杂度O(nlogn)


 qsort3:利用随机位置的数做轴,会使数组的快速排序得到优化。

【知识点】产生某个范围随机数方法:
  比如要产生 [60-99]的随机数.
  使用rand()函数产生的随机数是从0(包括0)开始的
  我们思考:

  [ 0,?] + 60 =[60,99]
  很明显,?应该是39.产生[0, 39]的随机数可以这样做:rand() % 40 得解.




rand()%(end-start)+start;


注意:因为rand()函数是按指定的顺序来产生整数,因此每次执行上面的语句都打印相同的值,所以说C语言的随机并不是真正意义上的随机,有时候也叫伪随机数


二,习题
     2)Lomuto的快速排序算法如下
       
      采用哨兵优化后算法:(减少了内循环测试)

      
        5)没完全理解题意
        
        6)选择排序
          希尔排序:选择排序的优化

        9)线性时间寻找第k小元素
          思路:快速排序选择一个pivot对数组进行划分,左边小于pivot,右边大于等于pivot,所以我们计算左边小于pivot(加上pivot)的个数count总共有多少,如果等于k,正是我们所要的,如果大于k,说明第k小的数在左边,那就在左边进行我们的递归;否则,在右边,那么说明右边的第k-count小的数就是我们所要的,在右边进行我们的递归。
          算法实现一:

算法实现二:


14)算法实现如下:









分享到:
评论

相关推荐

    编程珠玑 编程珠玑 编程珠玑 编程

    我觉得不错,和大家分享! 编程珠玑 编程珠玑 编程珠玑

    编程珠玑源码下载编程珠玑书后源代码

    编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码编程珠玑书后源代码

    编程珠玑编程珠玑

    编程珠玑编程珠玑

    编程珠玑之位图排序

    输入:一个最多包含n个正整数的文件,每个数都小于n,其中n=10^7,。如果在输入文件中有任何整数重复出现就是致命错误。没有其他数据与该整数关联。 输出:按升序排列的输入整数列表。 约束:最多有(大约)1MB的...

    编程珠玑 编程珠玑续

    编程珠玑和编程珠玑续两本,上传赚点分,填充填充填充

    编程珠玑之第二章questionC 测试数据

    本资源只是“编程珠玑之第二章questionC: 求变位词问题”的简单的测试数据。

    编程珠玑(续)

    《编程珠玑(续)》是计算机...书中涵盖了程序员操纵程序的技术、程序员取舍的技巧、输入和输出设计以及算法示例,这些内容组成一个有机的整体,如一串串珠玑展示给程序员。  《编程珠玑(续)》适合各级程序员阅读参考。

    编程珠玑 第二版 修订版

    第11章 排序 109 11.1 插入排序 109 11.2 一种简单的快速排序 110 11.3 更好的几种快速排序 113 11.4 原理 115 11.5 习题 116 11.6 深入阅读 117 第12章 取样问题 119 12.1 问题 119 12.2 一种解决方案 ...

    编程珠玑续本

    编程珠玑续、编程珠玑续本、编程珠玑续本、编程珠玑续本

    编程珠玑.pdf

    第11章 图形化输出 103 11.1 实例研究 103 11.2 显示结果取样 105 11.3 原理 107 11.4 习题 108 11.5 深入阅读 110 11.6 拿破仑远征莫斯科(边栏) 110 第12章 对调查的研究 113 12.1 有关民意调查的问题 113 12.2 ...

    编程珠玑及其源码

    编程珠玑,编程珠玑续以及源码,本书针对程序设计人员探讨了一系列的实际问题,这些问题是对现实中常见问题的归纳总结。作者虽然没有给出解决这些问题的具体代码,但始终非常富有洞察力和创造力地围绕着这些折磨...

    编程珠玑+续

    编程珠玑+续

    编程珠玑总结笔记

    编程珠玑是一本提升coding能力不可多得的好书,看书时,可以结合这个笔记,突出重点。

    《编程珠玑》源代码

    《编程珠玑》第一版是我早期职业生涯中阅读过的对我影响较大的书籍之一,在书中首次接触到的很多观点都让我长期受益。作者在这一版本中做了重要更新。新增加的很多例子让我耳目一新。 ——Steve McConnell,《代码...

    编程珠玑习题集锦

    书的内容围绕程序设计人员面对的一系列实际问题展开。作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程...《编程珠玑(第2版)》是计算机科学方面的经典名著。

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    编程珠玑II(编程珠玑·续) 扫描版6.56M pdf格式

    编程珠玑高清pdf

    这本书是《编程珠玑》高清pdf,如有侵权请告知。

    插入排序-《编程珠玑》

    详见:...简而言之,就是将一个数据很好的插入已经有序的数列中,当然,依然是递增或是递减; 思想:首先第一个数据肯定是有序的,由第二个数据开始处理,进行插入排序:

Global site tag (gtag.js) - Google Analytics