各种排序算法比较_第1页
各种排序算法比较_第2页
各种排序算法比较_第3页
各种排序算法比较_第4页
各种排序算法比较_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、排序算法专题- -排序算法一、插入排序(Insertion Sort)1.基本思想:每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;直到待排序数据元素全部插入完为止。2.排序过程:廿【示例】:初始关键字49 38 65 97 76 13 27 49J=2(38) 38 49 65 97 76 13 27 49J=3(65) 38 49 65 97 76 13 27 49J=4(97) 38 49 65 97 76 13 27 49J=5(76) 38 49 65 76 97 13 27 49J=6(13) 13 38 49 65 76 97 27 49J=7

2、(27) 13 27 38 49 65 76 97 49J=8(49) 13 27 38 49 49 65 76 97Procedure In sertSort(Var R : FileType);Begi nfor I := 2 To N Do beginR0 := RI; J := I - 1;While R0 RJ Do beginRJ+1 := RJ;J := J - 1endRJ + 1 := R0;endEnd;/对R1.N按递增序进行插入排序,R0是监视哨/依次插入 R2,.,Rn查找RI的插入位置/将大于RI的元素后移/插入 RI /In sertSort /二、选择排序1.基

3、本思想:每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。2.排序过程:【示例】:初始关键字 49 38 65 97 76 13 27 49 第一趟排序后 13 : 38 65 97 76 49 27 49 第二趟排序后1327 : 65 97 76 49 38 49第三趟排序后1327 38 97 76 49 65 49第四趟排序后1327 38 49 49 97 65 76第五趟排序后1327 38 49 49 97 97 76第六趟排序后13 2738 49 4976 76 97第七趟排序后13 2738 49 4976

4、76 97最后排序结果13 2738 49 4976 76 97Procedure SelectSort(Var R : FileType);Begi nfor I := 1 To N - 1 DobeginK := I;For J := I + 1 To N DobeginIf RJ RK Then K := J/对R1.N进行直接选择排序/做N - 1趟选择排序/在当前无序区 RI.N中选最小的元素 RKen d;If K I Then/交换 RI和 RK /begi n Temp := RI; RI := RK; RK := Temp; end;endEnd./SelectSort /三

5、、冒泡排序(BubbleSort)基本思想:两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换, 直到没有反序的数据元素为止。排序过程:设想被排序的数组 R : 1.N 垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则, 从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上漂浮,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。口【示例】:49 13 13 13 13 13 13 1338 49 27 27 27 27 27 2765 38 49 38 38 38 38 3897 65 38 49 49 49 49 4976 97

6、65 49 49 49 49 4913 76 97 65 65 65 65 6527 27 76 97 76 76 76 7649 49 49 76 97 97 97 97Procedure BubbleSort(Var R : FileType) / 从下往上扫描的起泡排序 /BeginFor I := 1 To N-1 Do/做 N-1 趟排序 /beginNoSwap := True;置未排序的标志/For J := N - 1 DownTo 1 Do/从底部往上扫描 /beginIf RJ+1 RJ Then/交换元素 /beginTemp := RJ+1; RJ+1 := RJ; R

7、J := Temp;NoSwap := Falseen d;en d;If NoSwap Then Return endII本趟排序中未发生交换,则终止算法/End./BubbleSort/四、计数排序计数排序的思想是若待排序的记录的关键字在一个明显的有限范围内 (整数)时,可设计 个数组,出现与数组下标值一样的数,该下标的数组元素值加1 ,最后扫描整个数组,根据 统计的信息给出一个有序数列。五、快速排序(Quick Sort )基本思想:在当前无序区R1.H中任取一个数据元素作为比较的”基准(不妨记为X),用此基准将 当前无序区划分为左右两个较小的无序区:R1.l-1和RI+1.H,且左边的

8、无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R1.l-1 X.KeyW RI+1.H(1 1齐当R1.l-1和RI+1.H均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。排序过程:Q【示例】:初始关键字 49 38 65 97 76 13 27 49 :第一次交换后27 38 65 97 76 13 49 49 :第二次交换后27 38 49 97 76 13 65 49 :J向左扫描,位置不变,第三次交换后27 38 13 97 76 49 65 49:I向右扫描,位置不变,第四次交换后

9、27 38 13 49 76 97 65 49:J 向左扫描 27 38 13 49 76 97 65 49 :(一次划分过程)初始关键字 49 38 65 97 76 13 27 49 :一趟排序之后27 38 13: 49 : 76 97 65 49 :二趟排序之后13 27 :38 49 : 49 65: 76 :97三趟排序之后13 27 38 49 49 : 65 76 97最后的排序结果13 27 38 49 49 65 76 97各趟排序之后的状态Procedure Partti on( Var R : FileType; L, H : In teger; Var I : In

10、teger);对无序区R1,H做划分,I给以出本次划分后已被定位的基准元素的位置/BeginI := 1; J := H; X := RI;初始化,X 为基准 /RepeatbeginJ := J - 1If I = X) And (I J) Do从右向左扫描,查找第 1个小于X的元素/ 已找到 RJ X/beginRl:-RJ;相当于交换 RI和RJI := I+ 1end;While (RI-X) And (I J) DoI := I+ 1从左向右扫描,查找第1个大于X的兀素/en d;If I X /beginRJ :- RI;/相当于交换 RI和 RJ/J := J-1endUn ti

11、l I = J5RI := X/基准X已被最终定位/End;/Parttion /Procedure QuickSort(Var R :FileType; S,T: Integer); / 对 RS.T快速排序 / BeginIf S T Then /当RS.T为空或只有一个元素是无需排序/beginPartion(R, S,T, I);对 RS.T做划分/QuickSort(R,S, I-1);/ 递归处理左区间RS,l-1QuickSort(R,I+1,T);递归处理右区间RI+1.T /en d;End./QuickSort/六、几种排序算法的比较和选择选取排序方法需要考虑的因素:待排序

12、的元素数目n;元素本身信息量的大小;关键字的结构及其分布情况;语言工具的条件,辅助空间的大小等。小结:若n较小(n .87879.332 *6.785 33242堆排序000.0310.1090.0310.015直接插入排序00.0478.70557.800024.865Shell排序000.0470.1100.0150.015归并排序000.0310.0940.0320.032基数排序000.470.1090.0470.046算法与结果联合分析冒泡排序:在最优情况下只需要经过n- 1次比较即可得出结果,(这个最优情况那就是序列己是正序,从 100K的正序结果可以看出结果正是如此),但在最坏情

13、况下,即倒序(或一个较小值在最后),下沉算法将需要n(n-1)/2 次比较。所以一般情况下,特别是在逆序时,它很不理想。它是对数据有序性非常敏感的排序算法。冒泡排序2:它是冒泡排序的改良(一次下沉再一次上浮),最优情况和最坏情况与冒泡排序差不多,但是一般情况下它要好过冒泡排序,它一次下沉,再一次上浮,这样避免了因一个数的逆序,而造成巨大的比较。如(2,3,4, , ,n- 1,n,1 ),用冒泡排序需要n(n-1)/2 次比较,而此排序只要 3轮,共比较(n-1)+(n-2)+(n-3)次,第一轮1将上移一位,第二轮1将 移到首位,第三轮将发现无数据交换,序列有序而结束。但它同样是一个对数据有

14、序性 非常敏感的排序算法,只适合于数据基本有序的排序。快速排序:它同样是冒泡排序的改进,它通过一次交换能消除多个逆序,这样可以减 少逆序时所消耗的扫描和数据交换次数。在最优情况下,它的排序时间复杂度为O (nlog2n)。即每次划分序列时,能均匀分成两个子串。但最差情况下它的时间复杂度将是O(nA2)。即每次划分子串时,一串为空,另一串为m-1 (程序中的100K正 序和逆序就正是这样,如果程序中采用每次取序列中部数据作为划分点,那将在正序和逆时达到最优)。从100K中正序的结果上看“快速排序”会比“冒泡排序”更慢,这主要是“冒泡排序”中采用了提前结束排序的方法。有的书上这解释“快速排序”,在

15、理论上讲,如果每次能均匀划分序列, 它将是最快的排序算法,因此称它作快速排序。虽然很难均匀划分序列,但就平均性能而言,它仍是基于关键字比较的内部排序算法中速度最快者。直接选择排序:简单的选择排序,它的比较次数一定:n(n- 1)/2。也因此无论在序列何种情况下,它都不会有优秀的表现(从上100K的正序和反序数据可以发现它耗时相差不多,相差的只是数据移动时间),可见对数据的有序性不敏感。它虽然比较次数多,但它的数据交换量却很少。所以我们将发现它在一般情况下将快于冒泡排序。堆排序:由于它在直接选择排序的基础上利用了比较结果形成。效率提高很大。它完 成排序的总比较次数为O (nlog2n)。它是对数

16、据的有序性不敏感的一种算法。但堆排序将需要做两个步骤:-是建堆,二是排序(调整堆)。所以一般在小规模的序列中不合适,但对 于较大的序列,将表现出优越的性能。直接插入排序:简 单的插入排序,每次比较后最多移掉一个逆序,因此与冒泡排序的 效率相同。但它在速度上还是要高点,这是因为在冒泡排序下是进行值交换,而在插入排序下是值 移动,所以直接插入排序将要优于冒泡排序。直接插入法也是一种对数据的有序性 非常敏感的一种算法。在有序情况下只需要经过 n-1次比较,在最坏情况下,将需要n(n-1)/2 次比较。希尔排序:增量的选择将影响希尔排序的效率。但是无论怎样选择增量,最后一定要 使增量为1,进行一次直接

17、插入排序。但它相对于直接插入排序,由于在子表中每进行一次 比较,就可能移去整个经性表中的多个逆序,从而改善了整个排序性能。希尔排序算是一种基于插入排序的算法,所以对数据有序敏感。归并排序:归并排序是一种非就地排序,将需要与待排序序列一样多的辅助空间。在 使用它对两个己有序的序列归并,将有无比的优势。其时间复杂度无论是在最好情况下还是在最坏情况下均是 0(nlog2n)。对数据的有序性不敏感。若数据节点数据量大,那将不适合。 但可改造成索引操作,效果将非常出色。基数排序:在程序中采用的是以数值的十进制位分解,然后对空间采用一次性分配, 因此它需要较多的辅助空间 (10* n+10),(但我们可以

18、进行其它分解,如以一个字节分解, 空间采用链表将只需辅助空间n+256)。基数排序的时间是线性的(即0(n)。由此可见,基数排序非常吸引人,但它也不是就地排序,若节点数据量大时宜改为索引排序。但基数排序有个前提,要关键字能象整型、字符串这样能分解,若是浮点型那就不行了。按平均时间将排序分为类:2平方阶(0(n )排序各类简单排序,例如直接插入、直接选择和冒泡排序;线性对数阶(0(nlog2n)排序如快速排序、堆排序和归并排序;1+ 0(n)排序是介于0和1之间的常数。希尔排序便是一种;线性阶(0(n)排序本程序中的基数排序,此外还有桶、箱排序。排序方法的选择因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法很重要若n较小,可采用 直接插入 或直接选择排序。当记录规模较小时,直接插入排序较好,它会比选择更少的比较次数;但当记录规模较大时,因为直接选择移动的记录数少于直接插人,所以宜用选直接选择排序。这两种都是稳定排序算法。若文件初始状态基本有序(指正序),则应选用 直接插人、冒泡或随机的快速排序 为宜(这里的随机是指基准取值的随机,原因见上的快速排序分析);这里快速排序算法将不稳定。若n较大,则应采用时间复杂度为 0(nlog

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论