快速排序讲解

快速排序采用的是分治思想,是一个将整体问题化为与之相似的局部问题,层层划分,最终大事化小,小事化了的思想。

这么说可能让人听着很懵,那不急,让我来带大家通过快速排序来理解分治思想。

快速排序的步骤有三步

  1. 首先设定一个分界值,通过该分界值将数组分成左右两部分。这一步就是体现了分治的“分”字,将大的整体,分为两部分。

    这一步需要选取一个分界值,这个值是任意的,具体实现时这个值可以是数组的第一个元素,也可以是最后一个元素,也能是中间元素。

  2. 然后将大于或等于分界值的数据放到数组右边,小于分界值的数据放到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。

  3. 接下来,我们要把左右部分再各自分为左右两部分,重复第一步。这一步体现了递归的思想。

简化一下语言,如下

  1. 确定分界点

  2. 调整区间

    两个区间,第一个区间小于等于x,第二个区间大于等于x

  3. 递归处理左右两段

代码实现的时候可以用一种更优雅的方式,即指针交换法,具体过程如下图所示
image
代码如下

#include <iostream>
using namespace std;

void quick_sort(int q[], int l, int r)
{
    if (l >= r)
        return;
    int x = q[l], i = l - 1, j = 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);
}
const int N = 1000;
int q[N];
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\n",q[i]);
    return 0;
}
posted @ 2023-09-24 23:29  加零lan  阅读(67)  评论(0编辑  收藏  举报