1、算法流程
(1)求取待排序数组A的最大值max;
(2)创建一个新的数组C[max+1],用于统计数组A中的每个元素a,小于等于a的个数。
(3)根据小于等于a的个数,来确定排序后,a在排序数组中的位置,进行位置填充;
2、代码实现
写代码需要注意事项:
(1)计数统计结束后,我们根据C[a]的大小填充元素a,每填充一次C[a]要减去1,这样是为了保证重复数据可以正常填充;
(2)填充如果是要稳定排序,那么需要使用反向填充的方案;
int * count_sort(int *data,int length) { int max=data[0]; for (int i = 1; i <length ; ++i) { if(max<data[i]) max=data[i]; } //统计每个数值计数 int *count=new int[max+1](); for (int i = 0; i<length ; ++i) { count[data[i]]++; } //从左往右,统计小于data[i]的数值个数 for (int i = 1; i <=max ; ++i) { count[i]+=count[i-1]; } int *sort_data=new int[length](); for (int i = 0; i<length; ++i) {//不稳定排序,因为相等的数值,位置会调换,如果要实现稳定排序,那么就需要反向填充,用i--的方式循环 sort_data[count[data[i]]-1]=data[i];//这边需要注意索引值等于:个数-1 count[data[i]]--;//重复数据问题,每填充一次,索引值就要往前移位 } delete[] count; return sort_data; } int test_sort() { int data[10]={5,1,6,7,8,4,2,2,10,13}; //非比较排序算法 int * sort_data=count_sort(data,10); for(int i=0;i<10;i++) { std::cout<<sort_data[i]<<std::endl; } delete[]sort_data; return 0; }