/*
计数排序需要占用大量空间,它仅适用于数据比较集中的情况。比如 [0~100],[10000~19999] 这样的数据。
计数排序是桶排序的一种特殊情况,可以把计数排序当成每个桶里只有一个元素的情况。
计数排序的基本思想是:对每一个输入的元素arr[i],确定小于 arr[i] 的元素个数。
所以可以直接把 arr[i] 放到它输出数组中的位置上。假设有5个数小于 arr[i],
所以 arr[i] 应该放在数组的第6个位置上。
计数排序只能适用于数据表
所以它具有局限性
比如:hah 6 xixi 6 hehe 7 enen 7 这些名字对应着有重复的成绩 你怎么排序并且输出谁是谁呢?
计数排序是计算排序构造了k个buckets来统计数据频次,
共需要两趟来实现排序,第一趟增量计数进行统计,
第二趟将计数统计的对应的数重写入 原始数据表 中。
或者我们说也可以新的数组存储 但是其实没必要
*/
#include<stdio.h>
void print(int *a){
int i;
for(i = 0; i < 9;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
int main(){
int i,j,index = 0;
int a[10] = {5,9,3,9,10,9,2,4,13,10};//10
printf("原序列:");
print(a);
int min,max;
min = max = a[0];//初始化
for(i = 1; i < 10; i++) {
min = (a[i] < min) ? a[i] : min;
max = (a[i] > max) ? a[i] : max;
}
int blen = max-min+1;
int book[blen]; //计数数组初始化0
for(i = 0; i< blen; i++)
book[i] = 0;
for(i = 0; i < 10; i++) //计数
book[a[i] - min]++;
for(i = min; i <= max; i++) //重新赋给原始数据表 只是通过计数数组按顺序赋值
for(j = 0; j < book[i - min]; j++)
a[index++] = i;
printf("排序后元素如下:");
print(a);
return 0;
}
计数排序
最新推荐文章于 2024-09-14 10:46:30 发布