【題目來自灰灰考研】
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 的大小填充元...