题意:输入一个数字序列,数字范围为
[
1
,
99
]
[1,99]
[1,99],输出该数字序列从小到大排序的结果。(水题)
题目分析:注意到 0 < n ≤ 2000000 0 < n ≤ 2000000 0<n≤2000000,如果用冒泡排序、选择排序则会超时,时间复杂度 O ( n 2 ) O(n^2) O(n2),而用快速排序则内存超限。因为要排序的数字范围较小,这里我用计数排序来解决,时间复杂度 O ( n + k ) O(n+k) O(n+k), k k k为数字范围。
A
C
AC
AC代码:
然而该题并没有限制内存,写个快速排序就过了。
#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;
}