排序演算法
時間複雜度
空間複雜度
排序方式
穩定性平均情況
最好情況
最壞情況
氣泡排序
o(n*n)
o(n)
o(n*n)
o(1)
內排序穩定
簡單選擇排序
o(n*n)
o(n*n)
o(n*n)
o(1)
內排序不穩定
直接插入排序
o(n*n)
o(n)
o(n*n)
o(1)
內排序穩定
希爾排序
o(n^1.3)
o(n)
o(n*n)
o(1)
內排序不穩定
歸併排序
o(nlogn)
o(nlogn)
o(nlogn)
o(n)
外排序穩定
快速排序
o(nlogn)
o(nlogn)
o(n*n)
o(logn)
內排序不穩定
堆排序o(nlogn)
o(nlogn)
o(nlogn)
o(1)
內排序不穩定
計數排序
o(n+k)
o(n+k)
o(n+k)
o(k)
外排序穩定
桶排序o(n+k)
o(n+k)
o(n*n)
o(n+k)
外排序穩定
基數排序
o(n*k)
o(n*k)
o(n*k)
o(n+k)
外排序穩定
注:1. 歸併排序的空間複雜度是o(n),要是用手搖演算法來實現原地歸併。則空間複雜度是o(1)。
2.排序演算法穩定性:排序前後相同元素的相對位置不變,則稱排序演算法是穩定的;否則排序演算法是不穩定的。
1. 插入排序: 直接插入排序 、希爾排序。
2.選擇排序:簡單選擇排序、堆排序。
3.交換排序:氣泡排序、快速排序
每種排序演算法都有優缺點。因此需要根據業務情況,結合演算法的優缺點來選擇排序演算法。
1. 待排序集合有序或基本有序
直接插入排序和氣泡排序將大大減少比較次數和移動記錄的次數,時間複雜度可降至o(n);
原表是否有序,對簡單選擇排序、堆排序、歸併排序和基數排序的時間複雜度影響不大。
2. 當待排序集合資料量比較大時
選用平均時間複雜度為o(nlogn)的演算法。也就是快速排序,歸併排序,堆排序。
快速排序是內部排序中被認為是最好的排序方法,待排序集合資料是隨機分布的,使用快速排序比堆排序和歸併排序效率高2到3倍。但是快速排序的缺點是不穩定,當集合資料越接近有序時,最壞情況時間複雜度為o(n^2)。
如果要求穩定性,則使用歸併排序。缺點,需要同樣大小的的儲存空間。
堆排序,時間複雜度不會出現比較壞的情況。如果對時間複雜度的最壞情況有要求,則使用堆排序。
3. 當待排序集合資料量比較小時(小於50)
使用簡單選擇排序或者直接插入排序。
4. 資料中重複的資料比較多
使用歸併排序或者希爾排序。
計數排序、桶排序、基數排序,暫時沒研究,不分析。
排序演算法的比較與總結
歸併 穩定,o nlogn 遞迴實現 大類排序方法 時間複雜度 空間複雜度 穩定性實現方法 備註交換法 冒泡法最差 平均都是o n 2 最好是o n 1穩定 n較小時較好 交換法雞尾酒冒泡法 最差 平均都是o n 2 最好是o n 1穩定 n較小時較好 交換法快速排序 平均o nlogn 最壞是o ...
演算法 排序演算法的介紹與總結(三)
1 什麼是堆 堆是一種樹結構,更準確的說是完全二叉樹。並且每個非葉節點的資料大於或等於 小於或等於 其左 右子結點的資料,這樣堆結構的根結點為最大值 最小值 堆稱為最大堆 最小堆 所以可以歸納為 堆是乙個完全二叉樹,非葉結點與左右子結點的資料有一定的大小關係。2 什麼是堆排序 完整的堆排序需要經過反...
排序演算法總結對比
常用排序演算法分析 void swap int x,int y 氣泡排序 時間複雜度為o n 2 兩兩比較,交換,每次內層迴圈在未排序序列中找出最大值放到已排序中 對於部分有序的序列來說,效率較高 穩定 void bubble sort int arr,int start,int end if po...