题意:输入一个数字序列,数字范围为[1,99][1,99][1,99],输出该数字序列从小到大排序的结果。(水题)
题目分析:注意到 0<n≤20000000 < n ≤ 20000000<n≤2000000,如果用冒泡排序、选择排序则会超时,时间复杂度O(n2)O(n^2)O(n2),而用快速排序则内存超限。因为要排序的数字范围较小,这里我用计数排序来解决,时间复杂度O(n+k)O(n+k)O(n+k), kkk为数字范围。
ACACAC代码:
然而该题并没有限制内存,写个快速排序就过了。
#include<stdio.h>
#include<algorithm>
#define mx 2000005
using namespace std;
int a[mx];
int main()
{
int i, n;
while(scanf("%d", &n), n){
for(i = 0; i < n; i++)
scanf("%d", &a[i]);
sort(a, a + n);
for(i = 0; i < n; i++){
if(i != n-1)//控制一下输出格式
printf("%d ", a[i]);
else
printf("%d\n", a[i]);
}
}
return 0;
}
另外一份用计数排序也过了:
#include<stdio.h>
#include<string.h>
int main()
{
int i, j, t, n, ans[105];
while(scanf("%d", &n), n){
memset(ans, 0, sizeof ans);
for(i = 0; i < n; i++){
scanf("%d", &t);
ans[t]++;//计数排序的基本思路就是用数组储存某个数字出现的次数
}
int flag = 1;
for(i = 1; i <= 99; i++){
for(j = 0; j < ans[i]; j++){
if(flag){//控制一下输出格式
printf("%d", i);
flag = 0;
}
else
printf(" %d", i);
}
}
printf("\n");
}
return 0;
}

本文探讨了在特定条件下,计数排序和快速排序在处理数字序列排序问题中的应用。通过对一道具体题目进行分析,展示了如何使用计数排序和快速排序解决大规模数字序列排序的问题,并比较了两种排序算法的时间和空间复杂度。
437

被折叠的 条评论
为什么被折叠?



