【数据结构之排序11】各种内部排序方法的比较和选择

转载 2013年10月23日 11:54:04

按平均时间将排序分为四类:


(1)平方阶(O(n2))排序
     一般称为简单排序,例如直接插入、直接选择和冒泡排序;

(2)线性对数阶(O(nlgn))排序
     如快速、堆和归并排序;

(3)O(n1+£)阶排序
     £是介于0和1之间的常数,即0<£<1,如希尔排序;

(4)线性阶(O(n))排序
     如桶、箱和基数排序。

各种排序方法比较


简单排序中直接插入最好,快速排序最快,当文件为正序时,直接插入和冒泡均最佳。

影响排序效果的因素

因为不同的排序方法适应不同的应用环境和要求,所以选择合适的排序方法应综合考虑下列因素:
①待排序的记录数目n;
②记录的大小(规模);
③关键字的结构及其初始状态;
④对稳定性的要求;
⑤语言工具的条件;
⑥存储结构;
⑦时间和辅助空间复杂度等。

不同条件下,排序方法的选择


(1)若n较小(如n≤50),可采用直接插入或直接选择排序。

当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。


(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;


(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。

若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的  排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。


(4)在基于比较的排序方法中,每次比较两个关键字的大小之后,仅仅出现两种可能的转移,因此可以用一棵二叉树来描述比较判定过程。
当文件的n个关键字随机分布时,任何借助于"比较"的排序算法,至少需要O(nlgn)的时间。
箱排序和基数排序只需一步就会引起m种可能的转移,即把一个记录装入m个箱子之一,因此在一般情况下,箱排序和基数排序可能在O(n)时间内完成对n个记录的排序。但是,箱排序和基数排序只适用于像字符串和整数这类有明显结构特征的关键字,而当关键字的取值范围属于某个无穷集合(例如实数型关键字)时,无法使用箱排序和基数排序,这时只有借助于"比较"的方法来排序。
若n很大,记录的关键字位数较少且可以分解时,采用基数排序较好。虽然桶排序对关键字的结构无要求,但它也只有在关键字是随机分布时才能使平均时间达到线性阶,否则为平方阶。同时要注意,箱、桶、基数这三种分配排序均假定了关键字若为数字时,则其值均是非负的,否则将其映射到箱(桶)号时,又要增加相应的时间。


(5)有的语言(如Fortran,Cobol或Basic等)没有提供指针及递归,导致实现归并、快速(它们用递归实现较简单)和基数(使用了指针)等排序算法变得复杂。此时可考虑用其它排序。


(6)本章给出的排序算法,输人数据均是存储在一个向量中。当记录的规模较大时,为避免耗费大量的时间去移动记录,可以用链表作为存储结构。譬如插入排序、归并排序、基数排序都易于在链表上实现,使之减少记录的移动次数。但有的排序方法,如快速排序和堆排序,在链表上却难于实现,在这种情况下,可以提取关键字建立索引表,然后对索引表进行排序。然而更为简单的方法是:引人一个整型向量t作为辅助表,排序前令t[i]=i(0≤i<n),若排序算法中要求交换R[i]和R[j],则只需交换t[i]和t[j]即可;排序结束后,向量t就指示了记录之间的顺序关系:
        R[t[0]].key≤R[t[1]].key≤…≤R[t[n-1]].key
  若要求最终结果是:
       R[0].key≤R[1].key≤…≤R[n-1].key
则可以在排序结束后,再按辅助表所规定的次序重排各记录,完成这种重排的时间是O(n)。


原文地址:http://student.zjzk.cn/course_ware/data_structure/web/main.htm

常用的内部排序方法-比较排序

所谓的内排序是指所有的数据已经读入内存,在内存中进行排序的算法。排序过程中不需要对磁盘进行读写。同时,内排序也一般假定所有用到的辅助空间也可以直接存在于内存中。与之对应地,另一类排序称作外排序,即内存...
  • wl044090432
  • wl044090432
  • 2017年01月22日 14:58
  • 888

【数据结构与算法】内部排序总结(附各种排序算法源码)

这篇博文我们简要地总结下各种内部排序方法。 这10种排序算法中,前面7种属于建立在“比较”基础上的排序算法,通过决策树已经证明,任何基于比较进行的排序算法的时 间复杂度不可能再优于O(n*lo...
  • mmc_maodun
  • mmc_maodun
  • 2014年03月11日 00:03
  • 5115

数据结构之各种排序的比较

(一)直接插入排序 算法简洁,但是只有当待排元素n比较少的时候效率才高 所需空间:一个当前元素的哨兵array[0]即可 所需时间:主要与所需关键字的比较次数及移动的次数有关 最坏的情况—...
  • fengxiaoke_fxk
  • fengxiaoke_fxk
  • 2012年09月02日 00:07
  • 3141

【数据结构排序算法系列】数据结构八大排序算法

排序算法在计算机应用中随处可见,如Windows操作系统的文件管理中会自动对用户创建的文件按照一定的规则排序(这个规则用户可以自定义,默认按照文件名排序)因此熟练掌握各种排序算法是非常重要的,本博客将...
  • htq__
  • htq__
  • 2016年03月25日 22:36
  • 94410

9种常见内部排序算法的性能比较

在写完这9种常见的内部排序算法后总觉得需要把它们拿出来好好比较一番,看看各个算法的性能优劣。 我们先来看看各个排序算法的理论性能,再看实际性能。...
  • Thinkpad4180NC5
  • Thinkpad4180NC5
  • 2014年11月15日 23:01
  • 2509

数据结构中常用的排序算法

排序常用的算法有:插入算法(直接插入算法、折半插入算法、希尔算法)、选择算法(简单选择算法、堆排序算法)、快速算法(冒泡排序、快速排序算法) 以下程序给出了各种算法的实现,其接口为void sort(...
  • generalharry
  • generalharry
  • 2013年05月21日 11:27
  • 6781

数据结构之排序:排序基本概念和各种排序方法总结

排序的分类内部排序与外部排序按照排序过程设计的存储器的不同分为内部排序与外部排序。内部排序完全在内存中进行,适合数据量不太大的数据元素的排序。外部排序需要访问外部存储器,待排序的数据元素非常多,以至于...
  • u011080472
  • u011080472
  • 2016年05月02日 14:55
  • 1066

各种排序算法的总结和比较

1 快速排序(QuickSort)快速排序是一个就地排序,分而治之,大规模递归的算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。(1) 如果不多于1个数据,直接返回。(2) 一...
  • likefrank
  • likefrank
  • 2008年09月24日 21:13
  • 22871

数据结构教材之外的排序算法分析

本文介绍数据结构教科书上不常见的几种排序算法,并分析其性能。
  • keyeagle
  • keyeagle
  • 2010年12月16日 23:26
  • 733

八种常用内部排序算法总结

在公司实习了,由于公司的性质,以后的工作中用到算法&数据结构的知识可能会很少,很想把以前学的数据结构&算法的知识系统的回忆一下,但由于时间的原因,再加上我一直都很喜欢排序算法的思想。近期主要就排序这个...
  • Thinker_YU
  • Thinker_YU
  • 2014年10月18日 22:31
  • 3755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数据结构之排序11】各种内部排序方法的比较和选择
举报原因:
原因补充:

(最多只允许输入30个字)