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


一、内部排序方法:

①插入排序类:

(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种排序算法的平均比较次数的实验结果

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

nSelectionSortInsertionSortBottomUpSortMergeSortQuickSort
500124 75062 747385238526291
1000499 500261 2608682870415 693
15001 124 250566 62714 08513 98428 172
20001 999 0001 000 48819 39319 42634 020
25003 123 7501 564 52225 95125 11152 513
30004 498 5002 251 11231 24130 93055 397
35006 123 2503 088 97137 10236 76267 131
40007 998 0004 042 84242 88242 85979 432
450010 122 7505 103 51351 61549 07198 635
500012 497 5006 180 35856 88855 280106 178



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值