算法思路
- 统计待排序数列中每个数字出现的次数
- 入数据结构的过程其实就是排序的过程
- 最后再按照统计结果覆盖原序列就行了
PS: 前提条件是知道排序元素的范围
算法实现
void count(vector<int> &arr, int range) {
vector<int> count(range+1,0);
for (int i = 0;i < arr.size(); ++i) { //一次遍历,用hash记录元素
count[arr[i]] ++;
}
int ret = 0;
for (int i = 0;i < arr.size(); ++i) {
while(count[ret] == 0) ret ++;
arr[i] = ret;//从小到大,访问到hash不为0的则将其重新放入数组之中
count[ret] --;
}
}
算法分析
时间复杂度: O(n+k),k为元素上限,接近O(n),针对元素密集型的数组则排序优势较大。
空间复杂度: O(k)。