分析各种排序算法的优劣

来源:互联网 发布:淘宝违规记录在哪里看 编辑:程序博客网 时间:2024/06/04 20:13

八种常见排序算法

1、选择排序:每趟从待排序的记录序列中选择关键字最小的记录放置到已排序表的最前位置,直到全部排完。

2、直接插入排序:在要排序的一组数中,假设前面(n-1)[n>=2] 个数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

3、希尔排序:先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

4、基数排序:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

5、冒泡排序:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上
而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较
小的往上冒。

6、快速排序:选择一个基准元素,通常选择第一个元素或者最后一个元素,通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素,此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

7、归并排序:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。

8、堆排序:初始时把要排序的数的序列看作是一棵顺序存储的二叉树,调整它们的存储顺序,
使之成为一个堆,这时堆的根节点的数最大。然后将根节点与堆的最后一个节点
交换。然后对前面(n-1)个数重新调整使之成为堆。依此类推,直到只有两个节点
的堆,并对它们作交换,最后得到有n个节点的有序序列。

排序算法优劣

一、稳定性:
稳定:冒泡排序、直接插入排序、归并排序和基数排序
不稳定:选择排序、快速排序、希尔排序、堆排序

二、时间复杂性比较   

平均情况   最好情况    最坏情况     辅助存储

基数排序   O(n)         O(n)            O(n)            O(rd+n)

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

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

快速排序  O(nlogn)   O(nlogn)      O(n2)         O(logn)

希尔排序  O(n1.5)     O(n)            O(n1.5)       O(1)

插入排序  O(n2)        O(n)            O(n2)          O(1)

选择排序  O(n2)        O(n2)          O(n2)          O(1)

冒泡排序  O(n2)        O(n2)          O(n2)          O(1)


、排序算法的选择
1.数据规模较小
1)待排序列基本序的情况下,可以选择直接插入排序
2)对稳定性不作要求宜用简单选择排序,对稳定性有要求宜用插入或冒泡
2.数据规模不是很大
1)完全可以用内存空间,序列杂乱无序,对稳定性没有要求,快速排序,此时要付出logN)的额外空间。
2)序列本身可能有序,对稳定性有要求,空间允许下,宜用归并排序
3.数据规模很大
1)对稳定性有求,则可考虑归并排序。
2)对稳定性没要求,宜用堆排序
4.序列初始基本有序(正序),宜用直接插入,冒泡