计数排序
前言
学生党,手写一下计数排序
一、基础模板
void count_sort(int a[],int len){
int _min = INT_MAX, _max = INT_MIN;
for(int i=0;i<len;i++){
if(_min>a[i]){
_min = a[i];
}
if(_max<a[i]){
_max = a[i];
}
}
int range = _max-_min+1;
int bucket[range];
memset(bucket,0,sizeof(bucket));
for(int i=0;i<len;i++){
bucket[a[i]-_min]++;
}
int j=0;
for(int i=0;i<range;i++){
while(bucket[i]--){
a[j++] = i+_min;
}
}
}
(bucket通常用new申请空间。这里省事了)
二、以高考成绩排名为例
相当于数据范围已经确定,我们来求下排名:
int count_sort(int a[],int len, int score){
int bucket[751];
memset(bucket,0,sizeof(bucket));
for(int i=0;i<len;i++){
bucket[a[i]]++;
}
int my_rank = 1;
for(int i=750;i>=0;i--){
if(i>score){
my_rank += bucket[i];
}else{
break;
}
}
return my_rank;
}
总结
欢迎交流、讨论