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就不参与了。
算法思想:
- 确定分界点 x
- 调整区间,其中小于x,在其左边,大于x,在其右边
- 将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);
*/
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· 2分钟学会 DeepSeek API,竟然比官方更好用!
· .NET 使用 DeepSeek R1 开发智能 AI 客户端
· DeepSeek本地性能调优
· 一文掌握DeepSeek本地部署+Page Assist浏览器插件+C#接口调用+局域网访问!全攻略