- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
#define NUM_RANGE (100) //预定义数据范围上限,即K的值
void counting_sort(int *ini_arr, int *sorted_arr, int n) //所需空间为 2*n+k
{
int *count_arr = (int *)malloc(sizeof(int) * NUM_RANGE);
int i, j, k;
//初始化统计数组元素为值为零
for(k=0; k<NUM_RANGE; k++){
count_arr[k] = 0;
}
//统计数组中,每个元素出现的次数
for(i=0; i<n; i++){
count_arr[ini_arr[i]]++;
}
//统计数组计数,每项存前N项和,这实质为排序过程
for(k=1; k<NUM_RANGE; k++){
count_arr[k] += count_arr[k-1];
}
//将计数排序结果转化为数组元素的真实排序结果
for(j=n-1 ; j>=0; j--){
int elem = ini_arr[j]; //取待排序元素
int index = count_arr[elem]-1; //待排序元素在有序数组中的序号
sorted_arr[index] = elem; //将待排序元素存入结果数组中
count_arr[elem]--; //修正排序结果,其实是针对算得元素的修正
}
free(count_arr);
}
网友评论