计数排序/Counting Sort

计数排序的算法思想:

对于每一个元素x,只要确定了元素x有多少个比它小的元素,那么就可以知道其最终的位置。

记输入数组为A[n],存放最后排序输出的数组为B[n],提供临时存储空间的中间数组记为C[k]。

1\首先,将中间数组C[k]清0,其中,0~k为A[n]中元素的取值范围。

2\一边遍历A[n]一边将A[n]的元素值作为C[k]数组中的下标,C[A[n]]++;

3\从前到后遍历C[k],让c[i]=c[i-1]+c[i],这样就可以知道了每个待排元素有多少个比他们小的元素存在。

4\遍历A[n],以访问C[A[n]],按照C[A[n]]的值把元素放到B[n]数组去。由于有可能会有相同的元素,每次存放后C[A[n]]元素要减1,以便下一次再碰到相同的元素时放到前一个位置。

 

具体实现代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int a[10]= {31,27,13,26,15,20,1,10,5,38}; //输入数组
 6     int b[10];//用来存放排序的输出
 7     int c[40];//中间数组,40表示待排序列中的每个元素都小于40
 8 
 9     for(int i=0; i<40; i++) c[i]=0; //将中间数组置0
10     for(int i=0; i<10; i++) c[a[i]]++;
11     for(int i=1; i<40; i++) c[i]=c[i]+c[i-1];//统计有多少输入元素小于i
12 
13     for(int j=9; j>=0; j--)
14     {
15         b[c[a[j]]-1]=a[j];
16         c[a[j]]--;
17     }
18     for(int i=0; i<10; i++)
19         cout<<b[i]<<" ";
20     cout<<endl;
21     return 0;
22 }

 

posted @ 2018-03-15 15:17  -DP-  阅读(165)  评论(0编辑  收藏  举报