统计数字(快速排序,emmm,更更快)

问题 F: 统计数字

时间限制: 1 Sec  内存限制: 128 MB
提交: 153  解决: 83
[提交][状态][讨论版][命题人: 外部导入]

题目描述

某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入

输入包含n+1行:

       第1行是整数n,表示自然数的个数。 

       第2~n+1行每行一个自然数。

输出

输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

样例输入

8
2
4
2
4
5
100
2
100

样例输出

2 3
4 2
5 1
100 2

提示

 


    40%的数据满足:1<=n<=1000

 


    80%的数据满足:1<=n<=50000

 


    100%的数据满足:1<=n<=200000,每个数均不超过1 500 000 000(1.5*109)

#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn =200000 +5;
typedef long long ll;
ll a[maxn],n;
void sort(int left,int right)//闭区间
{
	int i=left,j=right,x,y;
	x=a[(left+right)/2];
	do{
		while(a[i]<x&&i<right)
			i++;
		while(a[j]>x&&j>left)
			j--;
		if(i<=j)
		{
			y=a[i];a[i]=a[j];a[j]=y;
			i++;j--;
		}
	}while(i<=j);
	if(left<j) sort(left,j);
	if(right>i) sort(i,right);
}
void print(int n)
{
	int b=a[0],c=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]==b)
		c++;
		else
		{
			printf("%d %d\n",b,c);
			b=a[i];
			c=1;
		}
	}
	printf("%d %d\n",b,c);	
}
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{scanf("%lld",&a[i]);}
	sort(0,n-1);
	print(n);
}

//快速排序2:以中间元素来分区间

//对数组a中的元素a[left]、a[left+1]……a[right] 排序

void sort(int a[ ],int left, int right)

{ int i,j,x,y;i=left ; j=right;

x=a[(left+right)/2]; //用中间元素

do { while ( a[i]x && j>left ) j--;

//找一个比x小的元素a[j] if ( ii ) sort(a,i+1,right); //排序后半部分

}

复制可能遗漏,看上面代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值