常見的排序演算法有如下幾種:
選擇排序
交換排序
二路歸併排序
基數排序
外部排序
直接插入排序:新建乙個佇列(當然也可以不新建,只是麻煩點),將元素依次插入新佇列中,保證新佇列裡的元素是按序插入的。
時間複雜度:o(n^2),空間複雜度o(1),穩定
折半插入排序:和直接插入排序類似,只是在尋找插入點的時候使用的是二分查詢法。對效率略有提高。
時間複雜度:o(n^2),空間複雜度o(1),穩定
希爾排序:按某種分法將待排序列分成幾個子串行,對每個子串行進行直接插入排序。但必須保證最後一次的增量是1。
時間複雜度:o(n^2)
或o(n^1.5)
,空間複雜度o(1),不穩定
氣泡排序:每次都是兩個兩個相鄰元素比較,每一輪下來總能選出乙個元素其位置是固定的。而且,氣泡排序的結束條件是某一輪中沒有元素交換。
時間複雜度:o(n^2)
,空間複雜度o(1),穩定
快速排序:算是分冶法吧,每次選乙個元素出來(通常是第乙個),然後將比它小的元素全放它左邊,比它大的元素全放它右邊。然後再分別對左右兩邊使用快排(遞迴)。
時間複雜度:o(nlog2n)
,空間複雜度o(log2n),不穩定
希爾排序:從待排序列中選擇最小(或最大)值與第乙個元素交換(當然這個得依次往後挪),因為是交換,所以這也導致了不穩定,不過如果採用的不是交換,而是插入,那麼又是穩定的。
時間複雜度:o(n^2)
,空間複雜度o(1),不穩定
堆排序:資料結構裡的堆和棧是有區別的,當然其他地方也有,但是不一樣。這裡的堆是指乙個完全二叉樹,它總能根據一定的變形,使得能很輕鬆地找出最大(或最小)值。
時間複雜度:o(log2n)
,空間複雜度o(1),不穩定
二路歸併排序:就是通常說的歸併排序,將待排序列一分為二,二分為四…這樣分下去挨個排好序再合起來。
時間複雜度:o(log2n)
,空間複雜度o(n),穩定
基數排序:不是桶排序。不過也使用了「桶」,所謂「桶」其實就是棧,不過是很多個棧,待排序列中最小單位有幾個就需要幾個棧…三言兩語講不清,請自行查詢資料
時間複雜度:o(d(n+rd))
,空間複雜度o(rd),穩定
注:d為關鍵字的關鍵字位數;n為關鍵字數;rd為關鍵字基的個數
外部排序和上面的所有排序演算法都不一樣。
上述排序都是把資料載入到記憶體中進行排序,而外部排序之所以不放到記憶體上是因為資料太多,記憶體裝不下。
常見的方法我們可以採用歸併演算法,畢竟歸併演算法是可以先對某一部分排序,最後再來整合即可。
我們這裡採用的確實也算歸併排序,不過是k路歸併排序,不是上面的2路歸併了。想來也很好理解,只要我們將資料分為m個部分,每個部分內部是排好序的,那麼每次從這m個部分中的最小值中選出乙個最小值,就是整個資料的最小值了,就是這樣進行排序的。
上述演算法當然夠了,但是不夠好,因此才引出了一些更加高階的演算法。
他們的名稱和作用分別如下:
時間複雜度:快排、歸併、堆排序都是o(nlog2n),而希爾排序奇葩點(o(n^2
)或者o(n^1.5))
,了解即可),其他均為o(n^2),哦對了,那個基數排序也是奇葩,它是o(d(n+rd))
空間複雜度:快排是o(log2n),歸併是o(n),基數排序是o(rd),其他都是o(1)
穩定性:希爾、快排、簡單選擇(使用交換而不是插入的情況)、堆排序 不穩定,其他都穩定
注:當只需要查詢最大(或最小)的100個的這種情況的時候,如果資料量遠大於100,那麼使用堆排序效率最高。
上述只是乙個總結,並不詳細,嘻嘻見諒~~
常見排序演算法總結(不詳細)
常見的排序演算法有如下幾種 選擇排序 交換排序 二路歸併排序 基數排序 外部排序 直接插入排序 新建乙個佇列 當然也可以不新建,只是麻煩點 將元素依次插入新佇列中,保證新佇列裡的元素是按序插入的。時間複雜度 o n 2 空間複雜度o 1 穩定 折半插入排序 和直接插入排序類似,只是在尋找插入點的時候...
常見排序演算法總結
sort.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std const int len 100 class csort 注意此處應該有分號 csort csort length len 建構函式,初始化陣列 arr j 1 ...
常見排序演算法總結
1.氣泡排序 蠻力法 基本思想 兩兩比較相鄰記錄,如果反序側交換,直到沒有反序的記錄為止。如果是正序排,將待排序的元素看作是豎著排列的 氣泡 較小的元素比較輕,從而要往上浮。時間複雜度 o n n void bubblesort int a,int n 優化的氣泡排序 if flag 0 break...