幾種不常用的排序演算法

2022-07-18 23:09:21 字數 1251 閱讀 9818

基於比較大排序演算法至少需要o(n*lgn)的複雜度。對於一些特殊的輸入我們有一些特殊的演算法,有可能得到複雜度為o(n)的演算法。本文簡要描述其中的幾種:count排序,基數排序和桶排序。

count排序的假設是被排序的字段在乙個有限的範圍內,比如對1000人按照年齡排序。

count排序需要兩個額外的變數,乙個用於存放排序結果,長度是n,另乙個用於存放中間結果,長度是k。其中n為輸入的長度,k-1為輸入資料的最大值。

設輸入a[0..n-1],初始化變數 b[0..n-1], c[0..k-1],演算法如下:

for i = 0 .. k-1

c[i] = 0

for j = 0 .. n-1

c[a[j]] ++

for i = 1 .. k-1

c[i] = c[i-1] + c[i]

for j = n-1 .. 0

b[c[a[j]]-1] = a[j]

c[a[j]] --

容易證明這個演算法複雜度為o(n+k)。考慮到k一般為o(n),所以整體複雜度為o(n)。

基數排序的起源是撲克牌的排序,先按照花色排序,再按照數字排序。如果要對一些10進製數排序,比如:123,456,321,789.可以按照從低位到高位的順序,先第一位排序,再第二位排序,依次類推。需要注意兩點:

1. 必須先低位後高位,因為高位更有決定權,只有當高位一樣的時候,才按照低位到順序排序,這就是第二點:

2. 按照某位排序時,排序演算法必須是穩定的;

演算法很簡單:

for i = 1..b

按照第i位排序,穩定排序

很容易看到這個複雜度是o(b*(n+k)),其中n是輸入元素個數,k是輸入元素在某個位上元素個數。b是輸入元素的位數。

稍微變化一下,不是每位排序一次,而是分成若干組,每組有r位,那麼複雜度為o(b/r * (n+2^r))。以r為變數,對這個表示式求最小值。分幾種情況:

1. b2. b>=lgn,取r=lgn,複雜度也是o(n)

桶排序桶排序更類似於count排序的連續版本。count排序需要輸入是整數。桶排序假設輸入在0~1區間均勻分布。假設輸入a[1..n],滿足a[i]小於1,大於等於0,後我們把該0~1等分成n份,每份是乙個bucket。然後用b陣列[1..n]分別存放對應區間的a的元素,並對這些元素使用插入排序。最後將b的各個元素對應的list串聯起來。比較麻煩的是這個演算法的複雜度證明。結論是如果輸入的分布滿足均勻分布,那麼複雜度為o(n).

幾種有趣的不常見排序

幾種有趣的不常見排序演算法 我們常見的排序演算法有簡單選擇,冒泡,插入,兩路合併,希爾,堆,快速排序等等,下面介紹幾種不常見的排序演算法。雞尾酒排序 雞尾酒排序是氣泡排序的微調演算法。我們還記得,氣泡排序是每次遍歷整個序列,把較大的 我們這裡假設公升序排序 交換到後面。雞尾酒排序在交換到後面後,再逆...

幾種常用的排序演算法

介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...

幾種常用的排序演算法

介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n 2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很有效率地被實...