線性時間排序 計數排序 基數排序 桶排序

2021-07-25 04:38:55 字數 1787 閱讀 6636

之前總結的都是通過比較方法進行排序的演算法,我們知道,通過比較排序演算法平均時間複雜度最多為o(lgn)。

這篇文章來分析一下非比較的線性時間排序方法,計數排序,基數排序,桶排序。

正如它的名字,計數排序是通過計算待排序元素小於等於該元素的次數這個屬性,然後利用該屬性將元素以次數為下標挪入另外的陣列,不能原地挪動,就得到了排序後的結果。

**如下:

void counting_sort(int* arr, int* result, const int size, const int k)

}

時間複雜度為o(n),空間複雜度,o(n+k)

注意:>>>1.計數排序一共使用了兩個額外陣列。乙個用來存放結果即result陣列,乙個用來計數count陣列。result陣列是用來存放結果的,自然它的大小和原陣列arr的大小是完全一致的。而count陣列使用來對每個元素計數的,它的下標就是原陣列中的元素,所以它的大小由原陣列中最大值決定,大小是最大值max+1,這裡我們通過外部引數傳入,它就是k。這麼做是因為它需要支援最大值的計數。

>>>2.每次計數前需初始化,這是所有counter共同遵循的特徵。上面**中vector已經初始化過了。

>>>3.對每乙個原陣列元素,它現在是count陣列的下標,所以count[arr[i]]表示它出現的次數,可能是重複出現的。

>>>4.我們需要將count陣列中內容乙個乙個累加起來,每乙個當前座標對應的值,表示小於等於它的座標(原陣列值)的元素數目。

>>>5.倒著for迴圈是為了

保證排序的穩定性。因為我們倒著回去,並且會將count[arr[i]減一,正好是後面arr[i]對應未減一前的count值,所以後面的元素由於count值大會被放在後面。

>>>6.

千萬要注意賦給result時下標要減1,因為count陣列中元素的最小值是1,不可能某個arr[i]元素在count中出現了0次。result的下標最小值為0,所以需要減1。否則會越界。

測試檔案:

int main()

; int len = sizeof(array) / sizeof(len);

int result[len];

std::fill(result, result+len, 0);

counting_sort(array, result, len, 15);

for(auto i : result)

cout《基本思想:

將待排序陣列中的每組關鍵字依次進行桶分配。比如對三位數排序,我們先分配十個桶,分別裝數字0~9。我們先按個位吧所有數放入相應的桶中,然後按桶序0~9在吧它們輸出。然後按十位把他們再次放入桶中,按桶序再次輸出。重複多次,得到就是有序陣列。

我們可以利用佇列陣列來輕易實現基數排序的桶集合。每次push進去,然後按桶下標在pop出來,重複操作就完成排序。

看一道題:

對於乙個int陣列,請編寫乙個基數排序演算法,對陣列元素排序。

給定乙個int陣列a及陣列的大小n,請返回排序後的陣列。保證元素均小於等於2000。

測試樣例:

[1,2,3,5,2,3],6

[1,2,2,3,3,5]

**如下:

class radixsort 。這些資料全部在1—100之間。因此我們定製10個桶,然後確定對映函式f(k)=k/10。則第乙個關鍵字49將定位到第4個桶中(49/10=4)。依次將所有關鍵字全部堆入桶中,並在每個非空的桶中進行快速排序。

有一種說法桶排序不是一種實現,而是一種思想,比如基數排序就是用了bucket,我認為它也可以算作一種桶排序。

桶排序 基數排序 計數基數排序 Java

前面已經講述了很多排序演算法,但是他們的排序演算法都是基於兩個值之間的比較,通過決策樹的方法可以證明深度為d的二叉樹則最多有 一些好的排序演算法是可以達到時間複雜度是線性的,桶排序就是其中一種。比如有n個數,但是這些數的最大數不超過m。這個時候就可以定義乙個含有m個元素的陣列 初始值為0 然後遍歷n...

桶排序 基數排序 計數排序

桶排序 1.原理 將需要排序的陣列分在有限的桶裡 然後對每個桶中的數分別排序 對每個桶的操作 1.別的排序演算法 2.以遞迴的方式繼續使用桶排序 2.過程 假設待排序的一組數統一的分布在乙個範圍中,並將這一範圍劃分成幾個子範圍,也就是桶 將待排序的一組數,分檔規入這些子桶,並將桶中的資料進行排序 將...

排序 基數排序(計數排序 桶排序)

在此對於桶排序做出兩種方法 一.簡化版桶排序 如下 簡化版的桶排序 include int main scanf d n 輸入乙個數n,表示接下來有n個數 for i 1 i n i 迴圈讀入n個數,並進行桶排序 for i 0 i 1000 i 依次判斷編號1000 0的桶 getchar get...