原理

  1. 找轴值,然后从轴值处一分为二,进行递归操作

  2. 递归出口,就是只剩一个元素,该元素,就为本身的轴值

  3. 向上一层回溯,找到上一层,右边的轴值

  4. 排序就是由每个轴值组成

第一次划分演示

图片描述

结果演示

clipboard.png

//快速排序

#include<iostream>
using namespace std;

//划分,查找轴值(数组的第一个元素,是查找对象,轴值右边 :> 轴值,左边:< 轴值)
int divide(int r[], int first, int end);

//递归,将大——>小
void quick_sort(int r[], int first, int end);

int main()
{
    int r[100], n;
    while (cin >> n, n != EOF)
    {
        for (int i = 0; i < n; i++)
        {
            cin >> r[i];
        }
        quick_sort(r, 0, n - 1);
        for (int i = 0; i < n; i++)
        {
            cout << r[i]<<" ";
        }
        cout << endl;
    }
    return 0;
}

int divide(int r[], int first, int end)
{
    int i = first;
    int j = end;

    //轴值位置确定条件——i == j, i ,j 均指向轴值,说明轴值不需要和任何数做比较了
    int temp;
    while (i < j)
    {
        //对轴值右侧进行扫描——找出小于轴值的第一个数,交换位置,到轴值的左边

        //跳出循环——向右侧扫描时,遇到 < 轴值的数
        while (i < j&&r[i] <= r[j])j--;
        //交换
        if (i < j)
        {
            temp = r[i];
            r[i] = r[j];
            r[j] = temp;
            //已经交换到 最靠近左边了,故i前面的值都是不需要扫描的了
            i++;
        }

        //同理,扫描左侧,同时j指向轴值

        //轴值在右边,左边值应小于 轴值,否则跳出循环
        while (i < j&&r[i] <= r[j])i++;
        if (i < j)
        {
            temp = r[i];
            r[i] = r[j];
            r[j] = temp;
            j--;
        }
    }
    return i;//返回轴值所在位置
}

void quick_sort(int r[], int first, int end)
{
    int mid;
    //不满足条件时,跳出这一层递归,返回上一层继续执行
    if (first < end)
    {
        mid = divide(r, first, end);//找轴值
        quick_sort(r, first, mid);//左递归
        quick_sort(r, mid + 1, end);//右递归
    }
}


Light
11 声望0 粉丝

引用和评论

0 条评论