1097 统计数字
现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果
桶排序?
没错就是桶排序
虽然说这个题的本质是桶,但我们需要用的是快速排序
快速排序的模板,没有什么太大的难度
然后处理完统一进行统计
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
int a[200005];
int n,i,front,cnt;
void qs(int x[],int left,int right)
{
if(left<right)//不重合,类似于队列
{
int i=left,j=right,key=x[left];//key记录基准数
while(i<j)
{
while(i<j&&x[j]>key)
j--;
if(i<j)
x[i++]=x[j];
while(i<j&&x[i]<key)
i++;
if(i<j)
x[j--]=x[i];//两个交换
}
x[i]=key;
qs(x,left,i-1);
qs(x,i+1,right);///进行分割
}
}
int main()
{
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
qs(a,0,n-1);//记录数组 前后哨兵
front=a[0];//以第一个数为基准
cnt=1; //记录出现次数
for(i=1;i<=n;i++) //i从1开始
{
if(a[i]!=front)//排序过程这几个
{
printf("%d %d\n",front,cnt);
cnt=0;
}
front=a[i];//更新front
cnt++; //更新次数,接着下一次
}
return 0;
}