第一类是简单算法,包括直接插入排序、简单选择排序和起泡排序,这些算法都比较简单和直接,易于理解。第二类算法是改进后的算法,包括折半插入排序、希尔排序、锦标赛排序、堆排序、快速排序和归并排序(归并排序可看作为对直接插入排序的另一种改进,它把记录分组排序,但分组的方法同希尔排序不同;另外,它把记录的插入和移动改为向另一个数组的复制),这些算法都比较复杂。第三类是基数排序,它不是基于排序码比较进行排序,而是另辟蹊径,通过一系列分配和收集来排序。
就平均情况而言,直接插入排序、简单选择排序和起泡排序属于第一类,其时间复杂度为 O(n2) ;折半插入排序、堆排序、锦标赛排序、快速排序和归并排序属于第二类,其时间复杂度为 O(nlog2n) ;希尔排序介于这两者之间。 若从最好的情况考虑,则直接插入排序和起泡排序的时间复杂度最好,为 O(n) ,其他算法的最好情况同平均情况相同。 若从最坏的情况考虑,则快速排序的时间复杂度为 O(n) ,直接插入排序、希尔排序和起泡排序虽然同平均情况下相同,但是系数大约增加一倍,所以运行速度降低一半,最坏情况对简单选择排序(仅指比较次数)、锦标赛排序、堆排序、和归并排序影响不大。 若再考虑各种排序算法的时间复杂度的系数,则在第一类算法中,直接插入排序的系数最小,简单选择排序次之(但它的移动次数最小),起泡排序最大,所以直接插入排序和简单选择排序比起泡排序速度快;在第二类算法中,快速排序的系数最小,堆排序和归并排序次之,所以快速排序比堆排序和归并排序速度快。 由此可知,在最好的情况下,直接插入排序和起泡排序最快;在平均的情况下,快速排序最快;在最坏的情况下,锦标赛排序、堆排序、归并排序最快。
第一类包括锦标赛排序排序和归并排序,其空间复杂度为 O(n) 。第二类是快速排序,其空间复杂度为 O(log2n) 。第三类包括其它算法,其空间复杂度为 O(1) 。由此可知,第三类算法的空间复杂度最好,第二类次之,第一类最差。
第一类是稳定的排序算法,包括直接插入排序,折半插入排序,起泡排序,归并排序,锦标赛排序和基数排序。第二类是不稳定的排序算法,包括希尔排序,简单选择排序,快速排序和堆排序。
设待排序元素序列的元素个数(问题规模)为n,则n越小,采用简单排序方法越合适;n越大,采用改进排序算法越合适。因为n越小, n2 同 nlog2n 的差距越小;而n越大, n2 和 nlog2n 的差距就越大。
元素本身的信息量越大,表明占用的存储数量就越多,移动元素时所花费的时间就越多,所以对元素移动次数越多的算法不利。例如,在三中简单排序算法中,简单选择排序移动记录的次数为 O(n) ,其它两种为 O(n2) ,所以当元素本身的信息量较大的时候,对简单选择排序算法有利,而对其它两种算法不利。
注:本文内容来自书籍《数据结构精讲与习题详解—考研辅导与答疑解惑》,殷人昆编著,清华大学出版社。仅供学习用