复习梗概
- 思想
- 如何取数字各个位位数
- 计数排序保证稳定性怎么保证
算法思想
- 基数排序思想:本质是按照个位数字,十位数字,百位数字。。。分别对数组进行排序
- 在排序高位的时候,就把前面低位的最终顺序完全确定了,直到排到最高位就完全确定顺序
而因为每位数字都是0-9的范围,又正好可以采用计数排序
- 思想不难,主要把思想转换成代码有一定难度,要注意如何取到每一位上的位数:个位:X/1%10 十位:X/10%10 百位:X/100%10
- 也要注意计数排序的写法细节,以及在位数和原元素索引之间的转换
输入数组:
9 6 7 5 8 8 29 15 11 10
计数排序基础版
计数数组【0-9】
次数 1 1 0 0 0 2 1 1 2 2
次数 1 2 0 0 0 4 5 6 8 10
按个位排序: 10 11 5 15 6 7 8 8 9 29
计数数组【0-9】
次数 6 3 1 0 0 0 0 0 0 0
次数 6 9 10 0 0 0 0 0 0 0
按十位排序: 5 6 7 8 8 9 10 11 15 29
排序结果:
5 6 7 8 8 9 10 11 15 29
时间及空间复杂度
基数排序基础版代码 及输出结果
计数排序函数
void countingSort(vector<int> &array,int radix){
int * countArray = new int[10]{
0};
for(int i = 0;i<array.size();i++){
countArray[array[i]/radix%10]++;
}
arrayPrint(countArray,10);
cout<<endl;
int locatingNum = 0;
for(int i = 0;i<10;i++){
if(countArray[i]==0){
continue;
}
locatingNum = locatingNum+countArray[i];
countArray[i] = locatingNum