名次排序:n(n-1)/2次比較排出名次,n次交換排好序;
選擇排序:不斷找出未排序元素中的最大值,將其移到陣列末尾。找最大值的演算法進行size-1次比較,總的比較次數為n-1+n-2+…+1=n(n-1)/2;
氣泡排序:和選擇排序類似,只是找未排序元素最大值的方法是「冒泡策略」,即從陣列頭部開始,不斷比較相鄰元素的,如果左邊的元素大於右邊,則兩者交換位置,直到把最大的元素交換到陣列末尾。n次冒泡過程比較次數為n(n-1)/2
插入排序:不斷往有序陣列裡插入新的值,從單元素陣列開始。每次插入時間複雜度為o(n
)o(n)
o(n)
,插入n次,總的複雜度為o(n
2)
o(n^2)
o(n2)。
1.堆排序:首先用待排序的元素初始化乙個大根堆,時間複雜度為o(n
)o(n)
o(n)
,每次刪除大根堆的根元素,並把剩餘的元素重排,時間為o(l
ogn)
o(logn)
o(logn
),執行n次這樣的操作,總的時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)。2.歸併排序:(二路歸併排序)利用分而治之的思想,把每個待排序的資料段,分為大致相等的兩段,分別進行排序,然後再把排序後的結果歸併起來,每一小段都可以繼續分成兩端再歸併,直到分成單個元素,從而實現分而治之。演算法複雜度為o(n
logn
)o(nlogn)
o(nlog
n)。是一種穩定排序。
3.快速排序:(三值取中,或取最左端元素為支點)同樣利用分而治之的思想,把待排資料分為三段,中間一段只有乙個元素,左邊段的元素都小於等於中間段,右邊的元素都大於等於中間段,然後每一小段繼續這樣劃分。演算法複雜度為o(n
logn
)o(nlogn)
o(nlog
n)**。是一種不穩定排序。**普通的快排再序列本身有序的情況下,左端或有段總是空的,這是最壞情況,時間複雜度為o(n
2)
o(n^2)
o(n2
);三值取中解決了這個問題,最壞情況下的時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n)1.箱子排序:將要排序的元素的所有range個取值可能,設計為range個箱子,從輸入個數為n的鍊錶的頭部開始,把每個元素輸出到對應值的箱子裡,相同的元素在同乙個箱子裡,採用鍊錶儲存。最後再從箱子裡把元素收集起來,即可得到乙個有序的鍊錶。把n個元素放到箱子裡,時間為θ(n
)\theta(n)
θ(n)
,把箱子裡的元素收集起來,時間最為θ(r
ange
)\theta(range)
θ(rang
e),總的時間複雜度為θ(n
+ran
ge
)\theta(n+range)
θ(n+ra
nge)
。當range和n是乙個數量級的時候,時間複雜度為θ(n
)\theta(n)
θ(n)
此方法適用於箱子的range小於等於和輸入元素n的情況。如果輸入了10個範圍在0-999內的數,即n=10,range=1000,那這個方法會很耗時。
2.基數排序:這是改進版的箱子排序。先將要排序的數根據乙個基數r分解之後再對分解得到的每一部分進行箱子排序,例如,輸入了10個範圍在0-999的數,我們以r=10為基數,將輸入的數分為個位,十位,百位,然後對於每一位分別進行箱子排序。每一位的範圍都是r,時間複雜度為θ(r
+n
)\theta(r+n)
θ(r+n)
。當基數和輸入數的數目在同一數量級時,時間複雜度變為θ(r
)\theta(r)
θ(r)
。此方法適用於輸入的range和遠遠大於n的情況。然後將range以r=θ(n
)\theta(n)
θ(n)
(基數和輸入的數的數目在同一數量級時)為基數分解後程式的時間複雜度最低。
需要注意的是,雖然插入排序等時間複雜度為o(n
2)
o(n^2)
o(n2
)在漸進情況下耗時很多,但在n比較小的時候效能反而比o(n
logn
)o(nlogn)
o(nlog
n)複雜度的要好。
所以stl設計的sort排序演算法,把這兩種綜合了起來,合併成乙個分段函式,當nc時採用堆排序。(不穩定排序)
stable_sort在nc時採用歸併排序(穩定排序)
排序演算法總結
1 直接插入排序 1 穩定性 穩定 2 適用情況 待排記錄規模較小,或者記錄已經基本有序 2 希爾排序 1 穩定性 不穩定 2 特點 希爾排序的執行時間依賴於增量序列,它的效率比直接插入排序有較大的改進。3 氣泡排序 1 穩定性 穩定 2 特點 當待排記錄基本有序是,氣泡排序是不錯的選擇 但由於氣泡...
排序演算法總結
1 選擇排序 選擇排序的思想是依次從待排序數列中選擇最大 小 的 第二大 小 的等等,然後依次重新排列為有序數列。void selectionsort int a,int n if min i 時間複雜度o n 2 2 歸併排序 void merge int a,int left,int mid,i...
排序演算法總結
學習了這麼多的排序演算法,還沒有做個總結,呵呵 氣泡排序 氣泡排序是最慢的排序演算法。在實際運用中它是效率最低的演算法。它通過一趟又一趟地比較陣列中的每乙個元素,使較大的資料下沉,較小的資料上公升。它是 o n 2 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...