计数排序的算法思想:
对于每一个元素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 }