【概述】
计数排序是一种稳定的排序,属于非比较类排序,其基本思想是:对于给定的输入序列中的每一个元素 x,确定该序列中值小于 x 的元素的个数,一旦有了这个信息,就可以将 x 直接存放到最终的输出序列的正确位置上。
例如,如果输入序列中只有 17 个元素的值小于 x 的值,则 x 可以直接存放在输出序列的第 18 个位置上。当然,如果有多个元素具有相同的值时,不能将这些元素放在输出序列的同一个位置上,在代码中作适当的修改即可。
【排序过程】
计数排序的排序过程为:
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
【源程序】
#define MAXNUM 20//待排序数的最大个数
#define MAX 100//待排序数的最大值
int res[MAXNUM];
int temp[MAX+1];
void countSort(int a[], int n){
for(int i=0;i<n;i++)//统计i的次数
temp[a[i]]++;
for(int i=1;i<=MAX;i++)//对所有的计数累加,统计数组a的前缀和与小于小于a数组值出现的个数
temp[i]+=temp[i-1];
for(int i=n-1;i>=0;i--){//逆向遍历源数组,根据计数数组中对应的值填充到新数组中
res[temp[a[i]]-1]=a[i];//temp[a[i]]表示数组a中包括a[i]和小于a[i]的总数
temp[a[i]]--;//如果数组a中有相同的数,a[i]的下标-1
}
}