[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 @ 2022-04-13 15:13  wKingYu  阅读(22)  评论(0编辑  收藏  举报