您的位置:首页 > 其它

计数排序(Counting Sort)

2018-03-14 19:33 274 查看

计数排序(Counting Sort)

只要从输入数组A的末尾元素开始选择,计数排序就属于稳定的排序算法。

优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。这是一种牺牲空间换取时间的做法。

当O(k)>O(nlog(n))的时候其效率反而不如基于比较的排序。

基于比较的排序的时间复杂度在理论上的下限是O(nlog(n)),如归并排序,堆排序)

原理

这里以数字非负作为前提条件。

新建数组B,数组B的长度=数组A的最大值-最小值+1。

统计数组中每个值为i的元素出现的次数,存入数组B的第i项。

从数组B中秩为1的位置开始,每一项和前一项相加,这样就得到了A中比A[i]大的数字有多少个。

从后往前将每个元素i放在新数组C的第B[i]项,每放一个元素就将B[i]减去1

代码

#include <iostream>
using namespace std;
const int MAXN = 100000;
const int k = 1000; // range
int a[MAXN], c[MAXN], ranked[MAXN];
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> a[i];
++c[a[i]];
}
for (int i = 1; i < k; ++i) c[i] += c[i-1];
for (int i = n-1; i >= 0; --i) ranked[--c[a[i]]] = a[i];
for (int i = 0; i < n; ++i) cout << ranked[i] << " ";
cout<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: