洛谷-P1271 【深基9.例1】选举学生会

题目描述

学校正在选举学生会成员,有 n(n\le 999)n(n≤999) 名候选人,每名候选人编号分别从 1 到 nn,现在收集到了 m(m<=2000000)m(m<=2000000) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入 nn 和 mm 以及 mm 个选票上的数字,求出排序后的选票编号。

输入格式

输出格式

输入输出样例

输入 #1复制

5 10
2 5 2 2 5 2 2 2 1 2

输出 #1复制

1 2 2 2 2 2 2 2 5 5

 

分析:

排序篇的第一题,没啥说的,冒牌?选择?不行,两百万大小的数组在那摆着呢,想想都会超时,快排吧

啪啪啪啪,一顿手撸代码,写完了,不愧是练了一寒假的蓝桥杯,写快排还不是轻而易举?

#include<iostream>
#include<algorithm>
using namespace std;

int n;
int m;
int xp[2000005];
void quicksort(int left,int right);
int findmid(int left,int right);
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	cin>>xp[i];
	quicksort(1,m);
	//sort(xp+1,xp+m+1);
	cout<<xp[1];
	for(int i=2;i<=m;i++)
	cout<<" "<<xp[i];
	
	
	
	return 0;
}
void quicksort(int left,int right)
{
	if(left>=right)
	return;
	int midnum=findmid(left,right);
	//cout<<"mid is "<<midnum<<endl;
	quicksort(left,midnum-1);
	quicksort(midnum+1,right);
	return ;
}
int findmid(int left,int right)
{
	if(left>=right)
	return left;
	int high=right;
	int low=left;
	int temp=xp[low];
	while(low<high)
	{
		while(low<high&&xp[high]>=temp) high--;
		xp[low]=xp[high];
		while(low<high&&xp[low]<=temp) low++;
		xp[high]=xp[low];
	}
	xp[low]=temp;
	return low;
}

走你,五个测试数据,超时俩???

不是吧兄弟,这是快排,还能超时?快排都超时,其他的还玩什么?

人类迷惑大赏,没啥说的,去看看题解吧

emmmm,大家提到了桶排序,这是什么排序?之前没听过

竟然还有人用了c++STL里的sort就AC了??????怎么可能,我快排怎么会比他一个自带的sort还要慢?

一定是误判了,快排再来一遍,还是超时,我呆了,那试试sort吧,走你,我靠,AC了?

不行,我不相信,为什么快排还不如一个sort?

去网上找找答案,嗯....找到了一篇,原来sort并不慢啊,是基于快排改进的函数.....是我孤陋寡闻了,我之前一直以为自带的sort函数时间复杂度是O(n^2),好吧,记住了,以后多用这个了,而且貌似sort比你一般手写的快排性能还要好.....我去自闭会儿

上sort代码

#include<iostream>
#include<algorithm>
using namespace std;

int n;
int m;
int xp[2000005];
void quicksort(int left,int right);
int findmid(int left,int right);
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	cin>>xp[i];
	//quicksort(1,m);
	sort(xp+1,xp+m+1);
	cout<<xp[1];
	for(int i=2;i<=m;i++)
	cout<<" "<<xp[i];
	
	
	
	return 0;
}
void quicksort(int left,int right)
{
	if(left>=right)
	return;
	int midnum=findmid(left,right);
	//cout<<"mid is "<<midnum<<endl;
	quicksort(left,midnum-1);
	quicksort(midnum+1,right);
	return ;
}
int findmid(int left,int right)
{
	if(left>=right)
	return left;
	int high=right;
	int low=left;
	int temp=xp[low];
	while(low<high)
	{
		while(low<high&&xp[high]>=temp) high--;
		xp[low]=xp[high];
		while(low<high&&xp[low]<=temp) low++;
		xp[high]=xp[low];
	}
	xp[low]=temp;
	return low;
}

既然提到了桶排序,那就去看看桶排序是啥,以前也没听说过,看到一篇博客讲得不错

https://www.cnblogs.com/bqwzx/p/11029264.html

那就实现一下吧

#include<iostream>
#include<algorithm>
using namespace std;

int n;
int m;
int xp[2000005];
int a[1000];
void quicksort(int left,int right);
int findmid(int left,int right);
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	cin>>xp[i];
	for(int i=1;i<=m;i++)
		a[xp[i]]+=1;
	
	
	
	for(int i=1;i<=n;i++)
	{
		while(a[i])
		{
			cout<<i<<" ";
			a[i]--;
		}
	}
	
	
	
	return 0;
}

也AC了,看来桶排序还是有点用的,以后要多注意了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值