7.计数排序
#include <iostream>
using namespace std;
bool Counting_sort(int *a, int *b, int k, int n)
{
int *c = new int[k];
for(int i = 0; i <= k; i++)
c[i] = 0;
for(int i = 0; i < n; i++)
c[a[i]]++;
for(int i = 1; i <= k; i++)
c[i] += c[i - 1];
for(int i = n - 1; i >= 0; i--)
b[c[a[i]]-- - 1] = a[i];
return true;
}
int main()
{
int n;
cin >> n;
int *num = new int[n], *ans = new int[n];
int *k = &num[0];
for(int i = 0; i < n; i++)
{
cin >> num[i];
if(*k <= num[i]) k = &num[i];
}
Counting_sort(num, ans, *k, n);
for(int i = 0; i < n; i++)
cout << ans[i] << " ";
cout << endl;
}
时间复杂度:O(2(n + k)) == O(n);
没多大用处的排序算法,
a.只能对正数排序.
b.主要对批量小数据有用, 极易因k值过大导致MLE
c.个人能力原因,此排序算法的代码并不能优雅的写出来.
d.内存浪费严重, 好在时间复杂度不高(目前最低!?), 没多大实用价值。
对一些地方的解释:
a[i] 待排序的第i个数
b[i] 存储排序后序列
c[i] 值为i的数的个数 -> 值不大于i的数的个数
ps.可能是因为今晚状态不好, 计数排序的代码写的好烂, 有时间会重写的