数据结构各种排序方法的综合比较
结论:
排序方法平均时间最坏时间辅助存储
简单排序O(n2) O(n2) O(1)
快速排序O(nlogn)O(n2)O(logn)
堆排序O(nlogn)O(nlogn)O(1)
归并排序O(nlogn)O(nlogn)O(n)
基数排序O(d(n+rd))O(d(n+rd))O(rd)
PS:直接插入排序、冒泡排序为简单排序,希尔排序、堆排序、快速排序为不稳定排序
一、时间性能
按平均的时间性能来分,有三类排序方法:
时间复杂度为O(nlogn)的方法有:快速排序、堆排序和归并排序,其中以快速排序为最好;时间复杂度为O(n2)的有:直接插入排序、起泡排序和简单选择排序,其中以直接插入为
最好,特别是对那些对关键字近似有序的记录序列尤为如此;
时间复杂度为O(n)的排序方法只有,基数排序。
当待排记录序列按关键字顺序有序时,直接插入排序和起泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能蜕化为O(n2),因此是应该尽量避免的情况。
简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。
二、空间性能
指的是排序过程中所需的辅助空间大小。
1. 所有的简单排序方法(包括:直接插入、起泡和简单选择)和堆排序的空间复杂度为O(1);
2. 快速排序为O(logn),为栈所需的辅助空间;
3. 归并排序所需辅助空间最多,其空间复杂度为O(n );
4.链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)。
三、排序方法的稳定性能
1. 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。
2. 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。
3. 对于不稳定的排序方法,只要能举出一个实例说明即可。
4. 快速排序和堆排序是不稳定的排序方法
-----------------------------------------------------------------------------------
二、插入排序
1、直接插入排序
基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
排序过程:
3849659776132749...
3849657697132749
...
1338496576972749...
1327384965769749...
1327384949657697...
在直接插入排序中,为了找到插入位置,采用了顺序查找的方法。
为了提高查找速度,可以采用折半查找,这种排序称折半插入排序。
3、2-路插入排序
为减少排序过程中移动记录的次数,在折半插入排序的基础上加以改进:4938659778132749...
i=1
i=238
first
i=36538
final first
i=4659738
final first
i=565769738
final first
i=66576971338
final first
i=7657697132738
final first
i=849657697132738
final first
三、快速排序
1、起泡排序
首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换之,然后比较第二个记录和第三个记录的关键字。
直至第n-1个记录和第n个记录的关键字进行过比较为止。
然后进行第二趟起泡排序,对前n-1个记录进行同样操作。
...直到在某趟排序过程中没有进行过交换记录的操作为止。
49383838381313
38494949132727
65656513273838
977613274949
7613274949
13274965
274978
4997
初始第一趟第二趟第三趟第四趟第五趟第六趟
2、快速排序
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
初始关键字4938659776132749
i j j
1次交换之后
i i j
2次交换之后27389776136549
i j j
3次交换之后27381397766549
i i j
4次交换之后
ij j
完成一趟排序2738134976976549
初始状态4938659776132749
一次划分27381349976549
分别进行132738
结束结束496576
4965结束
结束
有序序列13273849496576。