[AcWing 785] 快速排序
点击查看代码
#include<iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int a[N];
void quick_sort(int l, int r)
{
if (l >= r) return;
int i = l - 1, j = r + 1, x = a[(l + r) >> 1];
while (i < j)
{
do ++ i; while (a[i] < x);
do -- j; while (a[j] > x);
if (i < j) swap(a[i], a[j]);
}
quick_sort(l, j);
quick_sort(j + 1, r);
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
quick_sort(0, n - 1);
for (int i = 0; i < n; i++) printf("%d ", a[i]);
return 0;
}
快速排序的思路:
1.有数组 a[N] ,左端点 l ,右端点 r ;
2.选定划分界限 x ,选定数组a[N]中间位置的值 a[l + r >> 1] 作为 x ;
3.将数组分为 "≤ x" 和 "≥ x" 两部分 ;
4.将所有 ≤ x 的元素都置于 x 的左边,所有 ≥ x 的元素都置于 x 的右边 ;
5.递归调用 quick_sort 求解左右两部分 ;
6.边界条件:左端点 l ≥ 右端点 r ;
快速排序的注意事项:
1.如果选左端点 l 或者右端点r处的数组值作为 x ,容易形成死循环 ;
2.初始化时,i = l - 1, j = r + 1, 因为后面的 "while" 语句会先执行 ++ i 和 -- j ;
3.递归调用时,传入的参数 quick_sort( l , j ),quick_sort( j + 1 , r ) ;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)