排序演算法 線性時間複雜度

2022-04-29 11:12:21 字數 2139 閱讀 3311

一說到排序演算法,大部分人都會說出著名的萬金油-快速排序、大資料分而治之-歸併排序、大資料排名-堆排序。這些排序無論在面試還是實際專案中,都是經常用到的一些排序演算法,其平均時間複雜度都在 o(n • log2n

),那今天我們就來介紹幾種 o(n)的排序演算法。

1,計數排序,輸入 n 個範圍在 0-k 區間的元素,當 !k >> n 時,排序的執行時間為 o(n)

論點:對於輸入的任一的元素 x,如果有 s 個元素小於,則元素 x 就可以放在 s+1 的位置上,這個時間複雜度近乎 o(1),我們僅需要得出對於每個元素有多少個小於的元素的列表即可在很短的時間內排序完成。

a.對原陣列進行遍歷,計算每個元素出現的次數,時間複雜度 o(n),空間複雜度 o(k)

原陣列額外記錄表,下標為元素,值代表出現的次數

b,將記錄的陣列進行計算整理,陣列中每個值代表小於當前下標的元素個數,時間複雜度o(k)

額外記錄表,下標為元素,值代表小於當前下標的元素個數

c.遍歷原陣列,並按最初提出的論點,進行最終的排序放置到最終陣列,並更新記錄表中的數值(v-1),時間複雜度o(n) * o(1),空間複雜度o(n)

綜上所述,所需要的時間複雜度為o(n) + o(k) + o(n)*o(1) = o(n + k),當元素的取值範圍較小時,可以達到 o(n)的時間複雜度,空間複雜度為o(n) + o(k) = o(n)

2,基數排序,建立在計數排序(發現兩種排序的諧音完全一樣^_^)的基礎上,所以請耐心閱讀上一段的流程。

論點:在實際專案過程中,我們需要排序的元素通常很難是在極小範圍,這裡我們可以利用位數的分隔,首先對所有數值的個位數進行計數排序,以此類推對十位、百位、千位。可以預見我們僅需要對當前元素組進行最大元素的位數次計數排序即可

假定最大元素為 x,則進行的計數排序個數為 r = ceil(ln(x)) 取上整數,每次計數排序的時間複雜度為 o(n + k) = o(n + 10) 整個演算法複雜度為 ceil(ln(x)) * o(n + 10),所以當最大一位的位數不會超過 ln(n),則整個排序演算法的複雜度為 位數 * o(n + 10) = o(n),這種排序演算法一般已經可以應用到很多專案場景中了,只是因為其編碼的複雜度和現代計算機的 cpu 效能提高,所以除非巨量的資料排序,否則一般還是會採用快速排序

3,桶排序,與基數排序是相反的思路,先生成 n 個相同大小的子區間(桶),將所有元素分到所屬的桶內,並按插入排序的方式,放入所屬的桶裡,時刻保證每個桶內部的資料是有序的。

論點:只要資料處於雜湊資料,可以預見每個桶的資料不會太多,除非極端情況下,但只要保證桶的個數,同樣可以保證演算法的線性時間複雜度(這裡先不談這種情況,這種已經類似於數值與陣列下標逆向,需要消耗大量的空間);

a.生成 n 個桶,並設定每個桶的取值範圍(可以去最大值後,向 n 倍數取上整,便於 hash 計算),時間複雜度 o(n),空間複雜度o(n),

b.遍歷整個陣列,將元素放入所屬桶,並根據插入排序保持桶的有序,時間複雜度∑

n-1i=0

(啊~!不會用這個數學符號編輯啊)o(ni

2),其中 ni 表示每次插入排序時當前桶的數量。

綜上所述,時間複雜度的總時間為 o(n) + ... 上面的數學公式(以後學會怎麼編輯再來修改)。當資料服從均勻分布時,每次的插入排序期望值為 n*o(2-1/n),驗證較為複雜,有興趣的同學可以參考演算法導論第三版.114頁。

可以得出時間複雜度為 o(n),數學驗證比較複雜,但使用邏輯推論思考,當趨近於均勻分布,幾乎每次插入排序都為常數級,則也可以得出結論

相信面試或者平時的工作,總會遇到符合條件的場景,用線性時間複雜度的演算法完全可以替代最常用的快速排序,無論是加分還是提高運算速度,都是乙個不錯的選擇 

排序演算法 時間複雜度和空間複雜度

常數階o 1 無論 執行了多少行,只要沒有迴圈複雜結構,那麼這個的時間複雜度就是o 1 o 1 時間複雜度 沒有迴圈結構的順序執行,無論執行多少行,時間複雜度均為o 1 public static voido1 對數階o log2n o log2n 時間複雜度 此處 i 以二倍的速度增長,也就是說到...

排序演算法空間 時間複雜度

排序演算法空間 時間複雜度 簡單排序法 冒泡法是第二維迴圈中自己迴圈,找最小或最大值 選擇排序和交換排序是第二維迴圈與第一維迴圈中的值比較 交換法最清晰,選擇法作了改進,只交換位置標號,演算法複雜度沒變。插入法,它的基本工作原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張 較為複雜 高階...

排序演算法空間 時間複雜度

排序演算法空間 時間複雜度 簡單排序法 冒泡法是第二維迴圈中自己迴圈,找最小或最大值 選擇排序和交換排序是第二維迴圈與第一維迴圈中的值比較 交換法最清晰,選擇法作了改進,只交換位置標號,演算法複雜度沒變。插入法,它的基本工作原理是抽出牌,在前面的牌中尋找相應的位置插入,然後繼續下一張 較為複雜 高階...