对于正整数而言,统计排序很有可能成为速度最快的排序算法。
这个排序算法的思想来源于标记思想。开一个标记数组,如果有这个数字出现,那么标记++。
我们不难看出,这个排序的时间复杂度取决于你输入的最大的数字的大小。
也就是O(max(a[i]));
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
#define LL long long int
#define INF 0x3f3f3f3f
const int maxn = 1e5 + 10;
int a[maxn];
int vis[maxn];
int main()
{
int n;
while (~scanf("%d",&n))
{
int max = -1;
for (int i = 0; i < n; i++)
{
cin >> a[i];
vis[a[i]]++;
if (a[i] > max)
max = a[i];
}
bool flag = 0;
for (int i = 0; i <= max; i++)
{
while (vis[i]>0)
{
vis[i]--;
if (flag == 0)
{
cout << i;
flag = 1;
}
else
{
cout << " " << i;
}
}
}
cout << endl;
}
return 0;
}
正负都可以判断的统计排序~
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
#define LL long long int
#define INF 0x3f3f3f3f
const int maxn = 1e8 + 10;
int a[maxn];
int vis[maxn];
int vis_[maxn];
int main()
{
int n; int T;
cin >> T;
while (T--)
{
scanf("%d", &n);
int max = -INF; int min = INF;
for (int i = 0; i < n; i++)
{
cin >> a[i];
if (a[i] >= 0)
vis[a[i]]++;
else
vis_[abs(a[i])]++;
if (a[i] > max)
max = a[i];
if (a[i] < min)
min = a[i];
}
bool flag = 0;
for (int i = min; i < 0; i++)
{
while (vis_[abs(i)] > 0)
{
vis_[abs(i)]--;
if (flag == 0)
{
cout << i;
flag = 1;
}
else
cout << " " << i;
}
}
for (int i = 0; i <= max; i++)
{
while (vis[i] > 0)
{
vis[i]--;
if (flag == 0)
{
cout << i;
flag = 1;
}
else
{
cout << " " << i;
}
}
}
cout << endl;
}
return 0;
}