P1177

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 1N103

对于 100 % 100\% 100% 的数据,有 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1N105 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109


不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++

有时间再看一遍

洛谷 P1177 【模板】快速排序(排序算法整理)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaneHan_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值