一、根據時間複雜度對排序演算法進行分類,其中n為資料樣本個數
1、複雜度為平方階o(n^2)
冒泡、選擇、插入排序
2、複雜度為o(nlogn)
快速、堆、歸併排序
3、複雜度為o(n^1+£)
希爾排序,其中£是介於0到1之間的
4、線性階o(n)
桶、箱、基數排序
二、排序演算法穩定性分析
1、穩定性的演算法:
插入排序、氣泡排序、歸併排序、桶、基數排序
2、不穩定排序
選擇排序、堆排序、快速排序、希爾排序
三、排序演算法的應用場景
根據不同的演算法的效能以及對使用的需求不同的排序演算法應用的場景不同。
考慮場景時,需要考慮以下幾個點:
1、待排序的記錄數目n;
2、記錄的大小(規模);
3、關鍵字的結構及其初始狀態;
4、對穩定性的要求;
5、語言工具的條件;
6、儲存結構;
7、時間和輔助空間複雜度等。
排序演算法選擇
(1)若 n 較小(如 n≤50),可採用直接插入或直接選擇排序。
當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。
(2)若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜;
資料量大的時候
(3)若 n 較大,則應採用時間複雜度為 o(nlgn)的排序方法:快速排序、堆排序或歸併排序。
快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分布時,快速排序的平均時間最短;
堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。
若要求排序穩定,則可選用歸併排序。
相關演算法實現過程c++版可以參照:
常見排序演算法小結
常見排序演算法時間和複雜度如下圖 氣泡排序核心 對於陣列a n for int i 0 i 改進 即使當發現陣列已經有序是跳出迴圈,使用方法就是在設定乙個flag,發現第二層的for迴圈一次都沒有進行交換就是表明陣列已經是有序的。時間複雜度o n 2 插入排序有3種,直接插入排序,二分插入排序,希爾...
常見排序演算法Java小結
原想將一些常見排序演算法做個小的android demo,以供偶爾檢視,後來發覺不太必要,故只記錄一些核心演算法,以便查詢。ps 此處均預設排序從小到大,序列不為空。1 選擇排序 1 選擇排序 public void select int nums temp nums size 1 i nums s...
常見排序演算法小結一(C 實現)(未完)
插入排序 與 希爾排序 選擇排序 與 堆排序 氣泡排序 快速排序 氣泡排序的改進 歸併排序 堆排序基數排序 桶排序計數排序 各種排序演算法的視覺化過程見 visualgo 為了對比各個排序演算法的效能,實現sort.cpp。static bool issorted int a,int len 測試陣...