資料結構 計數排序

2021-08-21 20:17:54 字數 1537 閱讀 3163

【題目來自灰灰考研】

counting sort基本思想: 

對於給定的輸入序列中的每乙個元素x,確定該序列中值小於x的元素的個數 。一旦有了這個資訊,就可以將x直接存放到最終的輸出序列的正確位置上。它建立乙個長度為這個資料範圍的陣列c,c中每個元素記錄要排序陣列中對應記錄的出現個數。 

下面以示例來說明這個演算法:

假設要排序的陣列為 a = 這裡最大值為3,最小值為0,那麼我們建立乙個陣列c,長度為4。然後一趟掃瞄陣列a,得到a中各個元素的總數,並保持到陣列c的對應單元中。比如0 的出現次數為2次,則 c[0] = 2;1 的出現次數為4次,則c[1] = 4。由於c 是以a的元素為下標的,所以這樣一做,a中的元素在c中自然就成為有序的了,這裡我們可以知道 順序為 0,1,3 (2 的計數為0)然後我們把這個在c中的記錄按每個元素的計數展開到輸出陣列b中,排序就完成了。 

也就是 b[0] 到 b[1] 為0 b[2] 到 b[5] 為1 這樣依此類推。 

這種排序演算法,依靠乙個輔助陣列來實現,不基於比較,演算法複雜度為 o(n) ,但由於要乙個輔助陣列c,所以空間複雜度要大一些,由於計算機的記憶體有限,所以這種演算法不適合範圍很大的數的排序。 

上述為計數排序演算法的經典解法,不過這個解法並不是最優的,因為空間複雜度還應該可以優化,我們完全可以不要那個輸出的陣列b,直接對c進行排序。 

演算法的步驟如下: 

1.找出待排序的陣列中最大和最小的元素 

2.統計陣列中每個值為i的元素出現的次數,存入陣列c的第i項 

3.對所有的計數累加(從c中的第乙個元素開始,每一項和前一項相加) 

4.反向填充目標陣列:將每個元素i放在新陣列的第c(i)項,每放乙個 元素就將c(i)減去1 

#include#include#include#include#define max 0x3f3f3f3f

#define min 0xc0c0c0c0

using namespace std;

void countsort(int data , int n)

//注意,最大值是要作為下標的,所以陣列長度加1

max += 1;

//這裡的臨時陣列大小是根據元素最大值為確定的

int tmp[max];

//這裡要對輔助陣列進行初始化

for(int i = 0; i < max; i++)

tmp[i] = 0;

//計數每個元素出現了多少次

for(int i = 0; i < n;i++)

tmp[data[i]]++;

int position = 0;

for(int i = 0; i < max; i++)

position += tmp[i];

} }}int main()

; countsort(data, 7);

for(int i = 0; i < 7; i++)

cout<}

資料結構 計數排序

計數排序基於桶排序。比如待排陣列 a 5 那麼就需要建造 105 max 100 min 1 6 大小的臨時陣列,將這 5 個元素按照,值減 100 min 作為下標儲存在臨時陣列中。如下圖所示 計數排序 param a paramn private static void jishu int a,...

資料結構 計數排序

之前講到的插入 希爾 選擇 堆 冒泡 快速 歸併排序都屬於比較排序 涉及到兩個數的比較 接下來要講到一種非比較排序演算法 計數排序。1 什麼是計數排序 計數排序是一種非比較性質的排序演算法,元素從未排序狀態變為已排序狀態的過程,是由額外空間的輔助和元素本身的值決定的。計數排序過程中不存在元素之間的比...

資料結構 九 計數排序

1 演算法流程 1 求取待排序陣列a 的最大值 max 2 建立乙個新的陣列c max 1 用於統計陣列 a中的每個元素 a,小於等於 a的個數。3 根據小於等於a 的個數,來確定排序後,a在排序陣列中的位置,進行位置填充 2 實現 寫 需要注意事項 1 計數統計結束後,我們根據c a 的大小填充元...