計數排序對輸入的資料有附加的限制條件:
1、輸入的線性表的元素屬於有限偏序集S;
2、設輸入的線性表的長度為n,|S|=k(表示集合S中元素的總數目為k),則k=O(n)。
在這兩個條件下,計數排序的複雜性為O(n)。
計數排序的基本思想是對於給定的輸入序列中的每一個元素x,確定該序列中值小於x的元素的個數(此處並非比較各元素的大小,而是通過對元素值的計數和計數值的累加來確定)。一旦有了這個資訊,就可以將x直接存放到最終的輸出序列的正確位置上。例如,如果輸入序列中只有17個元素的值小於x的值,則x可以直接存放在輸出序列的第18個位置上。當然,如果有多個元素具有相同的值時,我們不能將這些元素放在輸出序列的同一個位置上,因此,上述方案還要作適當的修改。
1 #include <iostream> 2 using namespace std; 3 const int k=1000; // range 4 int a[1000],c[1000],ranked[1000]; 5 int maxn=-1; 6 int main() 7 { 8 9 int n; 10 cin>>n; 11 for (int i=0;i<n;i++) 12 { 13 cin>>a[i]; 14 c[a[i]]++; 15 if(a[i]>maxn) 16 maxn=a[i]; 17 } 18 for (int i=1;i<=maxn;i++) 19 c[i]=c[i-1]+c[i]; 20 for (int i=0;i<=n-1;i++) 21 { 22 ranked[--c[a[i]]]=a[i];//--是為了方便輸出相同的數 23 24 for (int i=0;i<n;i++) 25 cout<<ranked[i]<<endl; 26 return 0; 27 }