目录
1.排序原理
思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。
操作步骤:
1. 统计相同元素出现次数
2. 根据统计的结果将序列回收到原来的序列中
根据我自己的理解就是数据集合在一段区间内;我们需要统计这个区间内的每个数字的个数;然后在从数据集合的开始数据往后一次还原数据集合;这样就完成了排序~~
假设我们的数据为:
我们发现数据集中集合在2->9之间并且数据重复较多~~
接下来我们统计每个数字出现的次数:
最后我们来还原数列:
我们可以看出来需要辅助空间~~
2.代码实现
void CountSort(int* arr,int size){//计数排序
int max=arr[0];
int min=arr[0];
int i=0;
for(i;i<size;i++){
if(arr[i]>max){//寻找最大值
max=arr[i];
}
if(arr[i]<min){//寻找最小值
min=arr[i];
}
}
int* Count=(int*)malloc(sizeof(arr[0])*(max-min+1));//申请空间
memset(Count,0,sizeof(arr[0])*(max-min+1));
int j=0;
for(j;j<size;j++){//计数数字
Count[arr[j]-min]++;
}
int k=0;
int index=0;
for(k;k<(max-min+1);k++){
while(Count[k]){
arr[index++]=min+k;
Count[k]--;
}
}
free(Count);
}
3.排序特性
时间复杂度:O(MAX(N,范围))
空间复杂度:O(范围)
稳定性:不稳定~~