一 引言
計數排序假設
n個輸入元素中的每乙個都是介於
0-k的整數,此處
k為某個整數。當k等於o(n)時,計數排序的執行時間為θ(n)。
二 基本思想
計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。
例如:如果有17個元素小於x,則x就位於第18個輸出的位置上。當然有幾個元素相同時,這個方法就略微改進一下,因為不能將它們放在同乙個位置上。
三 具體實現
假定輸入陣列為a[1..n],他們的值均位於0~k之間,輸出排序之後的陣列為b[1..n],以及臨時儲存陣列c[0..k]。計數排序的偽**如下:
上圖顯示出了計數排序的執行過程。
在第1~2行中的for迴圈初始化操作之後,在第3~4行檢查輸入的每乙個元素。如果輸入元素
的值為i,即增加c[i]的值。c[i]記錄了值為i的元素個數。
於是,在第4行之後c[i]中存放了等於i的元素的個數。在第6~7行中,通過
陣列c中記錄計數和,可以確定對每乙個i=0,1,2.....,k,有多少輸入元素是小於等於i的。
最後,在第9~11行中的for迴圈部分,把每乙個
元素a[j]放在輸出陣列b中與其相應的最終位置上。如果每乙個元素都不相同,則當第一次執行第9行時,對每乙個a[j],值c[a[j]]即
為a[j]在輸出陣列上的最終位置上,因為共有c[a[j]]個元素小於等於a[j]。
可是由於各個元素可能不一定是不同的,因此,每當將乙個值a[j]放入陣列b中時,都要減小c[a[j]]額值。這會使得下乙個值等於a[j]的輸入元素直接進入輸出陣列b中a[j]的前乙個位置。
四 **
/*********************************
* 日期:2014-04-26
* 題目: 計數排序
**********************************/
#include #include using namespace std;
void countingsort(int *a,int *b,int len,int k)
int c[k+1],i;
//初始化
for(i = 0;i <= k;i++)
//統計值為a[i]的個數,c[i]是等於i的元素個數
for(i = 0;i < len;i++)
//確定值a[i]在最終輸出陣列b中位置,c[i]是小於等於i的元素個數
for(i = 1;i <= k;i++)
//輸出到陣列b中
for(i = len-1;i >= 0;i--)
//b下標從1開始
}int main();
int b[9];
countingsort(a,b,8,5);
for(int i = 1;i <= 8;i++)
return 0;
}
五 時間複雜度分析
時間複雜度是多少呢?
第1~2行for迴圈所花時間為θ(k)。
第3~4行
for迴圈所花時間為θ(n)。
第6~7行for迴圈所花時間為θ(k)。
第9~11行
for迴圈所花時間為θ(n)。
這樣總的時間就是
θ(k+n)。在實踐中,檔k = o(n)時,我們常採用計數排序,這時執行時間為
θ(n)。
六 特點
1.提前必須是已知待排序的關鍵字為整型且範圍已知。
2.時間複雜度為o(n+k),不是基於比較的排序演算法,因此效率非常之高。
3.穩定性好,這個是計數排序非常重要的特性,可以用在後面介紹的基數排序中。
4.但需要一些輔助陣列,如c[0..k],因此待排序的關鍵字範圍0~k不宜過大。
經典演算法之計數排序
一 引言 計數排序假設 n個輸入元素中的每乙個都是介於 0 k的整數,此處 k為某個整數。當k等於o n 時,計數排序的執行時間為 n 二 基本思想 計數排序的基本思想就是對每乙個輸入元素x,確定小於x的元素個數。因此我們就可以直接把x放到最終輸出陣列中的相應位置上。例如 如果有 17個元素小於x,...
演算法之計數排序
核心思想 通過計算某個資料之前有多少個資料來確定自身的位置,不通過資料之間的相互比較,所以是非比較排序。原始計數排序 時間複雜度 o n k k為資料量 缺點 如果資料只有兩個,9999,10000,那麼會額外建立容量為10000的陣列,浪費空間。public static int countsor...
演算法之計數排序
原理 用乙個陣列記錄待排序陣列 現的數字。最低位代表最小值,偏移量是記錄陣列中的下標 待排序陣列 2 1 4 可以表示為 記錄陣列 1 1 0 1 陣列長度為 4 1 1 然後根據記錄陣列輸出結果 public static void countsort int arr if arr.length ...