AcWing785

AcWing785. 快速排序

一、题目描述

给定你一个长度为 n的整数数列。

请你使用快速排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式
输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼1091∼109 范围内),表示整个数列。

输出格式
输出共一行,包含 n 个整数,表示排好序的数列。

数据范围
1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5

二、算法原理

  • 每次排序时选取一个基准,将小于基准的数全部放到基准点的左边,将大于或等于基准的数全部放到基准的右边。
  • 完成后,得到了两个 整体 上有序的子数组,再递归继续,直至所有元素完成排序。

算法模拟:

假设对6,1,2,7,9,3,4,5,10,86,1,2,7,9,3,4,5,10,8这1010个数进行排序:

本次模拟的基准是以数组的第一个元素为基准的。

从后向前扫描,i去向右找第一个大于 基准6 (这个6是选择的第一元素,代码中我们将选择中间位置的元素,道理都是一样的) 的数字,j向左查找第一个小于基准6数字:

找到7和5,交换7和5

继续前进,找到9和4,然后交换

i >= j, 交换6 和3

交换之后:3,1,2,5,4,6,9,7,10,8 一趟排序结束。

以基准值66划分的两堆数据,左手边都比66小,右手边都比66大,66在中间,然后再用同样的办法递归处理左右两边即可,此时,66就不参与了。

算法思想:

  1. 确定分界点 x
  2. 调整区间,其中小于x,在其左边,大于x,在其右边
  3. 将x两边的进行排序,递归

三、实现代码

#include <iostream>

using namespace std;

const int N =10e6 + 10 ;

int q[N];

void quick_sort(int q[], int l, int r){
    if(l >= r) return;
    //1.确定x为分界点 
    int x = q[(l + r)/2],  i = l - 1, j = r + 1;
    //2.调整区间,其中小于x,在其左边,大于x,在其右边
    while(i < j){
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j ) swap(q[i],q[j]);
    }
    //3.将x两边的进行排序,递归
    quick_sort(q, l , j);
    quick_sort(q, j+1, r);
}

int main(){
    int n; 
    scanf("%d", &n);
    for(int i = 0; i < n; i ++) scanf("%d", &q[i]);
    
    quick_sort(q, 0, n-1);
    
    for(int i = 0; i < n ; i ++) printf("%d ", q[i]);
    
    return 0;
}

四、模板

边界问题:

第一个中,x的值取中间,如果x = q[r]与j、j+1,运行下面的模板时会出现问题,x = q[l]与i-1、i,也会出现问题,例如1,2两个数字,将第一个数字1与比,相同停止,j第一个2大于x,j往左移动一位,就停止了,紧接着quick_sort(q, l, i-1)中是下标0~-1,没有数字,quick_sort(q, i, r)中下标为0~1,而例子中初始下标也为0 ~1,因此会发生死循环。

void quick_sort(int q[], int l, int r)
{
    if (l >= r) return;

    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j)
    {
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
    /*  可以更换成
    quick_sort(q, l, i-1);
    quick_sort(q, i, r); 
    */
}
posted @   r#ookie  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略
点击右上角即可分享
微信分享提示