[AcWing 785] 快速排序

image


点击查看代码
#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 ) ;

posted @   wKingYu  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
欢迎阅读『[AcWing 785] 快速排序』
点击右上角即可分享
微信分享提示