题目描述
学校正在选举学生会成员,有n(n≤999) 名候选人,每名候选人编号分别从 1 到 n,现在收集到了m(m<=2000000) 张选票,每张选票都写了一个候选人编号。现在想把这些堆积如山的选票按照投票数字从小到大排序。输入 n 和m 以及 m 个选票上的数字,求出排序后的选票编号。
输入格式
无
输出格式
无
输入输出样例
输入
5 10
2 5 2 2 5 2 2 2 1 2
输出
1 2 2 2 2 2 2 2 5 5
一开始我使用了冒泡排序,发现运行超时了
冒泡排序的核心部分是双重嵌套循环。时间复杂度非常高。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[100000000],b,n,m;
cin>>n>>m;
for(int i=0;i<m;i++)
cin>>a[i];
sort(a,a+m);
for(int i=0;i<m;i++)
cout<<a[i]<<" ";
return 0 ;
}
突然想起快排>>>sort
(m<=2000000) 所以得安排更大的。
来造一个:
#include<stdio.h>
#include<iostream>
using namespace std;
int a[2000000],n;
void sort(int left,int right){
int i,j,t,temp;
if(left>right)
return;
temp=a[left];
i=left;
j=right;
while(i!=j){
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];
a[i]=temp;
sort(left,i-1);
sort(i+1,right);
}
int main(){
int i,j,t,b;
cin>>b>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(1,n);
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
方法总比困难多