P1177
题目
题目描述
将读入的 N N N 个数从小到大排序后输出。
输入格式
第一行为一个正整数 N N N。
第二行包含 N N N 个空格隔开的正整数 a i a_i ai,为你需要进行排序的数。
输出格式
将给定的 N N N 个数从小到大输出,数之间空格隔开,行末换行且无空格。
样例输入 #1
5
4 2 4 5 1
样例输出
1 2 4 4 5
提示
对于 20 % 20\% 20% 的数据,有 1 ≤ N ≤ 1 0 3 1 \leq N \leq 10^3 1≤N≤103;
对于 100 % 100\% 100% 的数据,有 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1≤N≤105, 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1≤ai≤109。
不AC解法(总结两个字:别看)
桶排序
只能得60
#include <stdio.h>
int main() {
int i, j, N, t;
int a[100001];
scanf("%d", &N);
if (N >= 1 && N <= 100000) {
for (i = 0; i <100001; i++) {
a[i] = 0;
}
for (i = 0; i < N; i++) {
scanf("%d", &t);
a[t]++;
}
for (i = 0; i <100001; i++) {
for (j = 1; j <= a[i]; j++) {
printf("%d ", i);
}
}
}
return 0;
}
运行结果:
插入排序
得分60,会TLE
#include <stdio.h>
int main() {
int i, j, N, x;
int a[100001];
scanf("%d", &N);
if (N >= 1 && N <= 100000) {
for (i = 0; i <N; i++) {
scanf("%d",&a[i]);
}
for(i=0;i<N;i++){
x=a[i];
for(j=i-1;j>=0&&a[j]>x;j--)
a[j+1]=a[j];
a[j+1]=x;
}
for(i=0;i<N;i++){
printf("%d ",a[i]);
}
}
return 0;
}
快速排序基础版
以最左为基准值
不能AC,会有三个TLE
#include <stdio.h>
void quicksort(int a[], int left, int right) {
int i, j, temp, t;
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[j];
a[j] = a[i];
a[i] = t;
}
}
a[left] = a[i];
a[i] = temp;
quicksort(a, left, i - 1);
quicksort(a, i + 1, right);
}
int main() {
int N,i;
scanf("%d", &N);
if (N >= 1 && N <= 100000) {
int a[100001];
for ( i = 0; i < N; i++) {
scanf("%d", &a[i]);
}
quicksort(a, 0, N - 1);
for ( i = 0; i < N; i++) {
printf("%d", a[i]);
if (i < N - 1) {
printf(" ");
}
}
}
return 0;
}
AC解法
快速排序升级版
查了下资料,改良后能AC
必须以中间值为基准数——也就是类二分法
#include <stdio.h>
int a[100005];
void quicksort(int a[], int left, int right) {
int i, j, temp, t;
if (left >= right) return;// 递归跳出条件
temp = a[(left+right)/2];// 采用中间位置的数作为支点
i = left;
j = right;
while (i <= j) {
while (a[j] > temp ) j--;// 从右往左,大于支点的数跳过
while (a[i] < temp ) i++;// 从左往右,小于支点的数跳过
if (i <= j) {
t = a[j];
a[j] = a[i];
a[i] = t;
i++;
j--;
}
}
// 注意:此时 j 一定小于 i
quicksort(a, left, j);// 递归处理左边的数
quicksort(a, i, right);// 递归处理右边的数
}
int main() {
int N,i;
scanf("%d", &N);
for (i = 0; i < N; i++)
scanf("%d", &a[i]);
quicksort(a, 0, N - 1);
for ( i = 0; i < N; i++)
printf("%d ", a[i]);
return 0;
}
全部方法整理
这里是大佬的整理的方法
C++
有时间再看一遍