数据结构-内部排序的比较《集合》

时间:2021-12-15 12:07:03


一、内部排序方法:

①插入排序类:

(1)直接插入排序  (2)折半插入排序  (3)2-路插入排序(4)表插入排序(5)希尔排序

       (稳定的排序)O(n2)                                                                                    (不稳定的排序)


②交换排序类:

(1)划分算法+快速排序                                                        (2)冒泡排序

        (不稳定的排序)O(nlogn)最坏情况:已经排好序          (稳定的排序)最坏情况下,比较次数为n(n-1)/2


③选择排序类:

(1)简单选择排序               (2)树形选择排序            (3)堆排序

     (不稳定的排序)O(n2)                                                (不稳定的排序)O(nlogn)

简单选择排序比较次数:O(n*n) 移动次数:O(n)

④归并排序类:

(1)合并两个已排序表+自底向上归并排序                 (2)自顶向上合并排序

       (稳定的排序)O(nlogn)


⑤基数排序

(1)多关键字排序(2)链式基数排序

       (稳定的排序)O(d(n+rd))也可以写成O(d·n)

适用于n值很大而关键字较小的序列。若关健字大,而序列中“最高位关键字”均不同,可以先“最高关键字”变成小序列后直接插入排序。

元素移动次数和关键字初始排序无关。


⑥其他排序

枚举排序(计数排序)


二、各种排序算法比较:


排序方法 平均情况 最好情况 最坏情况 辅助空间 稳定性
冒泡排序 O(n2) O(n) O(n2) O(1) 稳定
简单选择排序 O(n2) O(n2) O(n2) O(1) 不一定?
直接插入排序 O(n2) O(n) O(n2) O(1) 稳定
希尔排序 O(nlogn)~O(n2) O(n1.3) O(n2) O(1) 不稳定
堆排序 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(n) 不稳定
基数排序 O(d*(n+rd)) O(d*(n+rd)) O(d*(n+rd)) O(rd) 稳定
计数排序,牺牲空间换时间。辅助空间为可能输入的最大的数O(MAX), 平均情况,最好情况,最坏情况,都是O(MAX),应该也是算在稳定里面

从算法的简单性来看:

简单算法:冒泡、简单选择、直接插入、基数

改进算法:希尔、堆、归并、快速


从平均情况来看:

堆归并,归并,快速都为O(nlogn)       胜过        希尔排序O(nlogn)~O(n2)       胜过       冒泡,简单选择,直接插入

O(nlogn)           :(1)快速排序           (2)堆排序       (3)归并排序          , 平均下速度:堆 > 快速 > 归并 O(nlogn)~O(n2):(1)希尔排序                                                                       ,  因dlta增量序列变化复杂度变化:
O(n2)                :(1)直接插入排序    (2)冒泡排序   (3)简单选择排序 O(d*(n+rd))                  :(1)基数排序

最好情况来看:

冒泡,直接插入O(n)    更优。即如果待排序序列总是基本有序,那么反而不应该考虑4种复杂的改进算法


最快情况来看:

堆排序、归并排序O(nlogn)     胜过  快速排序,及其他O(n2)  


时间复杂度:

归并排序 和 堆排序 发挥稳定; 快速排序  时好时坏  ;冒泡排序  和  直接插入排序  在简单的,基本有序下表现好


稳定性:(一对数字不进行两次和两次以上比较)

稳定的排序:(1)冒泡排序(2)直接插入排序(3)归并排序(4)基数排序

不稳定的排序:(1)希尔排序(2)快速排序(3)堆排序

不一定:简单选择排序
具体介绍(介绍传送门


从待排序记录个数上: 待排序个数 n 越小,简单排序更适合。                    n 越大,改进的排序方法更适合。

下表给出了当n的值在500到5000之间时,5种排序算法的平均比较次数的实验结果

                       选择排序                       插入排序                   自底向上归并           自顶向下归并           快速排序

n SelectionSort InsertionSort BottomUpSort MergeSort QuickSort
500 124 750 62 747 3852 3852 6291
1000 499 500 261 260 8682 8704 15 693
1500 1 124 250 566 627 14 085 13 984 28 172
2000 1 999 000 1 000 488 19 393 19 426 34 020
2500 3 123 750 1 564 522 25 951 25 111 52 513
3000 4 498 500 2 251 112 31 241 30 930 55 397
3500 6 123 250 3 088 971 37 102 36 762 67 131
4000 7 998 000 4 042 842 42 882 42 859 79 432
4500 10 122 750 5 103 513 51 615 49 071 98 635
5000 12 497 500 6 180 358 56 888 55 280 106 178



综合来看,快速排序是性能最好的排序,,但不同场合我们要考虑不同的算法来应对。