计数排序
2015-07-18 12:08
330 查看
今天补CF的E,发现有个排序不会,计数排序,特地学习了一下
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
using namespace std;
/*
题意:计数排序
想法:把每个数字的出现的最后一个位置计算出来,然后按照a数组的数字出现的次序,逐一插入。
*/
int a[MAX];
int b[MAX];
int c[MAX];
int main()
{
//freopen("date.in","r",stdin);
int n;
int k = -INF;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
cin>>a[i];
k = max(k,a[i]);
c[a[i]]++;//统计a数组中,每个a[i]的个数
}
for(int i = 1;i<=k;i++)
{
c[i]+=c[i - 1];//统计a数组中,小于等于值为i的元素 个数
}
for(int i = n - 1;i>=0;i--)
{
b[--c[a[i]]] = a[i];
}
for(int i = 0;i<n;i++)
{
if(i)
puts(" ");
printf("%d",b[i]);
}
puts("");
return 0;
}
#include<iostream>
#include<cstdio>
#include<string.h>
#include<cstring>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>
#define LOCAL
#define ll long long
#define lll unsigned long long
#define MAX 1000009
#define eps 1e-8
#define INF 0x7fffffff
#define mod 1000000007
using namespace std;
/*
题意:计数排序
想法:把每个数字的出现的最后一个位置计算出来,然后按照a数组的数字出现的次序,逐一插入。
*/
int a[MAX];
int b[MAX];
int c[MAX];
int main()
{
//freopen("date.in","r",stdin);
int n;
int k = -INF;
scanf("%d",&n);
for(int i = 0;i<n;i++)
{
cin>>a[i];
k = max(k,a[i]);
c[a[i]]++;//统计a数组中,每个a[i]的个数
}
for(int i = 1;i<=k;i++)
{
c[i]+=c[i - 1];//统计a数组中,小于等于值为i的元素 个数
}
for(int i = n - 1;i>=0;i--)
{
b[--c[a[i]]] = a[i];
}
for(int i = 0;i<n;i++)
{
if(i)
puts(" ");
printf("%d",b[i]);
}
puts("");
return 0;
}