計數排序

weixin_30639719發表於2017-03-20

演算法思想

編輯
計數排序對輸入的資料有附加的限制條件:
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 }

 

轉載於:https://www.cnblogs.com/zwfymqz/p/6589026.html

相關文章