快速排序(Quick sort)

在这里插入图片描述

排序思路

1.选定中心轴(基准值),一般取arr[0];
2.将右侧小于中心轴的数字放到中心轴的左边,将左侧大于中心轴的数字放到中心轴的右边(实现上可以用左右索引)直到左右索引相遇,将中心轴位置的值放到相遇的索引位置即实现了以中心轴为划分左右;
3.分别对左右子序列重复前三步操作,直到子序列长度为1,递归跳出,排序完成。

代码的实现

void quickSort(int arr[],int l,int r){ 
    /*如果l>=r,不用排序*/
    if(l>=r){
        return;
    }   
    /*保存每次排序的基准值*/
    int centreVal = arr[l];
    /*记录待排序数组左右索引*/
    int rightIndex = r;
    int leftIndex = l;
    /*左索引<右索引开始排序*/
    while(leftIndex<rightIndex){
        /*右索引所指的值先比较,大于基准值则递减向左继续遍历*/
        while(leftIndex<rightIndex && arr[rightIndex]>=centreVal){
            rightIndex--;
        }
        /*找到小于基准值的元素,判断左右索引不等则将右索引所指元素赋值给左索引所指位置*/
        if(leftIndex<rightIndex){
            arr[leftIndex] = arr[rightIndex];
        }
         /*再比较左索引所指的值,小于基准值则递增向右继续遍历*/
        while(leftIndex<rightIndex && arr[leftIndex]<=centreVal){
            leftIndex++;
        }
        /*找到大于基准值的元素,判断左右索引不等则将左索引所指元素赋值给右索引所指位置*/
        if(leftIndex<rightIndex){
            arr[rightIndex] = arr[leftIndex];
        }
        /*左右索引相遇时本次排序完成,将保存的基准值放到两索引相遇的位置*/
        if(leftIndex>=rightIndex){
            arr[leftIndex]=centreVal;   
        }
    }   
    /*递归对基准值左右两边的数组分别排序*/
    quickSort(arr,l,rightIndex-1);
    quickSort(arr,leftIndex+1,r);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值