快速排序

本文详细介绍快速排序算法,包括算法步骤、原理及实现代码。通过实例演示快排过程,讲解如何选择基准值,以及如何通过递归对基准值左右两侧元素进行排序。

介绍

快排是最快的通用内部排序算法, 不需要辅助空间 。快排分为如下步骤:
1. 选择一个基准数据P,找到该基准数据在顺序数组中的位置。
2. 对已确定位置的基准数据P左侧的数据分别确定位置。
3. 对已确定位置的基准数据P右侧的数据分别确定位置。

算法详解

以如下七个元素的数组为例:
在这里插入图片描述
首先,我们任选基准,但为了实际代码编写的方便,一般选择第一个或最后一个元素作为基准值。此时我们选择31作为基准值,记为P。
另外,我们记I作为元素下标,J作为循环次数。
在这里插入图片描述
I=-1,J=0时,arr[J]<=P【23<31】为真,则I=0,数组为
在这里插入图片描述
I=0,J=1时,arr[J]<=P【62>31】为假,则数组不变
在这里插入图片描述
I=0,J=2时,arr[J]<=P【75<31】为假,则数组不变
在这里插入图片描述
I=0,J=3时,arr[J]<=P【29<31】为真,则I=1,数组为
在这里插入图片描述
I=1,J=4,5,6时,arr[J]<=P为假,则数组不变
在这里插入图片描述
J=7,循环条件不符合,故循环终止,此时I=1,swap(arr[I+1],P),结果为
在这里插入图片描述
此时,P【31】左侧元素都比31小,右侧元素都比31大,31位置确定,再对31左右两侧元素依次确定位置即可。

代码

#include <iostream>

using namespace std;

void swap(int &i,int &j){
    int tmp;
    tmp = i;
    i = j;
    j = tmp;
}

int partition(int *arr,int high,int low){
    int pivot = arr[high];
    int i = low-1;

    for(int j=low;j<high;j++){
        if(arr[j]<=pivot){
            i++;
            swap(arr[i],arr[j]);
        }
    }

    swap(arr[i+1],arr[high]);

    return i+1;
}

void quickSort(int *arr,int high,int low){
    if(low>=0&&low<high){
        int index = partition(arr,high,low);

        quickSort(arr,index-1,0);
        quickSort(arr,high,index+1);
    }
}
int main() {
    int arr[8] = {59,32,62,74,21,92,39,67};
    quickSort(arr,7,0);

    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值