【转】几种常见的排序算法之比较

来源:互联网 发布:海南网络机柜 编辑:程序博客网 时间:2024/06/07 02:37

对常见的这几种排序算法的练习,对我们的思路的规范化是很好的。学习前人是如何优化算法节约时间和空间的。

   我们所练习的排序主要是内部排序,所谓内部排序,就是整个排序过程都在内存进行的排序,称为内部排序;反之,若排序过程中要进行数据的内、外存交换,则称之为外部排序。内排序适用于记录个数不是很多的小文件,而外排序则适用于记录个数太多,不能一次性放人内存的大文件。

   对排序算法的分析可以从以下几个方面进行:排序算法的稳定性、平均时间、最坏情况、辅助存储空间。

   从稳定性来说,稳定的排序算法有:直接插入排序、冒泡排序、归并排序,其它排序算法都是不稳定的。

                               平均时间           最好情况          最坏情况        辅助空间

   直接插入排序            O(n*n)            O(n)                O(n*n)          O(1)

   希尔排序排序            O(n1+£)          O(n)                O(n*n)          O(1)   

                        £是介于0和1之间的常数

   冒泡排序                  O(n*n)            O(n)                O(n*n)          O(1)   

   快速排序                  O(nlogn)          O(nlogn)          O(n*n)         O(nlogn)

   直接选择排序             O(n*n)            O(n*n)            O(n*n)          O(1)

   堆排序                     O(nlogn)          O(nlogn)          O(nlogn)       O(1)

   归并排序                  O(nlogn)          O(nlogn)          O(nlogn)       O(1)

                  

各种排序方法比较

     简单排序中直接插入最好(稳定、易于实现),快速排序最快,当文件为正序时,直接插入和冒泡均最佳。

    (1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
    (2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
    (3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;堆排序所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。这两种排序都是不稳定的。若要求排序稳定,则可选用归并排序。但本章介绍的从单个记录起进行两两归并的排序算法并不值得提倡,通常可以将它和直接插入排序结合在一起使用。先利用直接插入排序求得较长的有序子文件,然后再两两归并之。因为直接插入排序是稳定的,所以改进后的归并排序仍是稳定的。

 

写出下列算法的时间复杂度。
(1)冒泡排序;
(2)选择排序;
(3)插入排序;
(4)快速排序;
(5)堆排序;
(6)归并排序;
答案:
冒泡排序算法时间复杂度是O(n^2)。
选择排序算法复杂度是O(n^2)。
插入排序算法时间复杂度是O(n^2)
快速排序快速排序是不稳定的。最理想情况算法时间复杂度O(nlog2n),最坏O(n^2)。
堆排序算法时间复杂度O(nlogn)。
归并排序的时间复杂度是O(nlog2n)。