简介:
算法步骤:
- 通过桶排序获得数组分布情况。
- 辅助数组记录对应下标前数值的分布情况(计数)
- 通过辅助数组的计数作为下标打印输出
详解:
通过分布情况,可以构建辅助数组,用来记录对应下标前待排序内容出现的次数。
1 | 2 | 3 | 5 |
---|
举个例子:如上所述,对应下标2之前有两个待排序数组,算上自己就有了3个待排数字。则如果打印数组,则下标2则需要在输出数组的第三个位置打印。
该算法的关键在于通过数值出现的次数值作为下标来达到排序的目的。
代码:
#include<bits/stdc++.h>
using namespace std;
void sort_count(int *n, int len){
int t1[1024], t2[1024], m[len];
memset(t1, 0, sizeof(t1));//辅助数组t1/t2初始化
memset(t2, 0, sizeof(t2));
for(int i = 0; i < len; i++){//散列待排序内容
t1[n[i]]++;
}
t2[0] = t1[0];
for(int i = 1; i < 1024; i++){//计数
t2[i] = t2[i-1] + t1[i];
}
for(int i = 0; i < len; i++){//计数值作为下标
m[--t2[n[i]]] = n[i];//容易出错
}
for(int i = 0; i < len; i++){//数组赋值,刷新数组n
n[i] = m[i];
}
}
int main(){
int len = 5;
int n[len];
for(int i = 0; i < len; i++){
cin >> n[i];
}
sort_count(n, len);
for(int i = 0; i < len; i++){
cout << n[i] << endl;
}
return 0;
}
计数排序的时间复杂度为O(n+k)