排序演算法總結

2021-09-25 11:18:10 字數 2317 閱讀 4885

名次排序: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 的演算法。快速排序 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來...