题目描述
学校正在选举学生会成员,有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
解题思路
这是一道简单的排序题,值得注意的是由于选票的数量最多达到2000000张,导致使用起泡排序等耗时较长的排序方法会让有些测试点TL(没错,正是在下),建议直接使用快速排序等时间复杂度低的方法进行排序。
AC代码
#include<iostream>
using namespace std;
int ticket[2000000] = { 0 };
long Partition(long first, long last);
void QuickSort(long first, long last);
int main()
{
//设置n和m
int n = 0;
long m = 0;
cin >> n >> m;
//设置选票编号
for (long i = 0; i < m; i++)
cin >> ticket[i];
//快速排序
QuickSort(0, m - 1);
//输出
for (long i = 0; i < m; i++)
{
cout << ticket[i] << " ";
}
return 0;
}
//排序函数
long Partition(long first, long last)
{
long i = first, j = last, temp = 0;
while (i < j)
{
//右侧扫描
while (i < j && ticket[i] <= ticket[j])
j--;
if (i < j) {
temp = ticket[i];
ticket[i] = ticket[j];
ticket[j] = temp;
i++;
}
//左侧扫描
while (i < j && ticket[i] <= ticket[j])
i++;
if (i < j) {
temp = ticket[i];
ticket[i] = ticket[j];
ticket[j] = temp;
j--;
}
}
return i;
}
//递归遍历对轴值两侧区域进行排序
void QuickSort(long first, long last)
{
if (first >= last)
return;
else {
long pivot = Partition(first, last);
QuickSort(first, pivot - 1);
QuickSort(pivot + 1, last);
}
}
使用C++库sort函数代码
//洛谷1271 【深基9.例1】选举学生会
#include<iostream>
#include<algorithm>
using namespace std;
int ticket[2000000] = { 0 };
int main()
{
//设置n和m
int n = 0;
long m = 0;
cin >> n >> m;
//设置选票编号
for (long i = 0; i < m; i++)
cin >> ticket[i];
//sort默认升序排序
sort(ticket,ticket + m);
//输出
for (long i = 0; i < m; i++)
{
cout << ticket[i] << " ";
}
return 0;
}
我真傻,真的,忘记去用C++的<algorithm>库自带的sort函数,傻傻的手搓快速排序...
我上了,sort秒了,没得说。(╯°□°)╯︵ ┻━┻