算法——快速排序

本文详细介绍了快速排序的两种常见实现:方式一通过左右指针分别寻找合适位置,方式二则是直接交换元素。这两种方法都以中轴值为基准,通过调整数组元素来达到排序的目的。代码实现清晰易懂,适用于理解快速排序的内部逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【1】方式一

①创建一个临时变量temp保存当前pivot的值
r左移遇到小于temp的直接赋值给l,然后l右移,遇到大于temp的直接赋值给r
③知道r==l,将temp的值写到这个位置上
在这里插入图片描述

代码实现:

public static void quick1(int[] arr, int left, int right) {
        if (left >= right)
            return;
        //保存中轴值
        int temp = arr[left];
        int l = left;
        int r = right;
        while (l < r) {
            //r左移
            while (arr[r] > temp && r > l) {
                r--;
            }
            if (r > l) {
                arr[l++] = arr[r];
            }
            //l右移
            while (arr[l] < temp && l < r) {
                l++;
            }
            if (l < r) {
                arr[r--] = arr[l];
            }
        }
        //中轴放到合适的位置
        arr[r] = temp;

        //递归
        quick1(arr, left, r - 1);
        quick1(arr, r + 1, right);
    }

【2】方式二:

① 直接r右移,遇到小于pivot的就停在这里,然后l右移遇到大于pivot的就与刚才r的位置的值交换。
② 重复刚才的操作
③ 知道r==l,将pivot的值写到rl重合的位置就行了
在这里插入图片描述

代码实现:

public static void quick2(int[] arr, int left, int right) {
        //等号不是必须的,有等号会提高效率
        if (left >= right)
            return;
        int l = left;
        int r = right;
        int temp = 0;
        int pivot = arr[left];
        while (r != l) {
            //右边找到小于等于pivot的
            while (arr[r] >= pivot && r > l) {
                r--;
            }
            //左边找到大于等于pivot的
            while (arr[l] <= pivot && l < r) {
                l++;
            }
            //交换这两个值,不写这句话效率降低,r=l的时候还会进行交换,这时直接跳出外层循环就好了
            if (r > l) {
                temp = arr[r];
                arr[r] = arr[l];
                arr[l] = temp;
            }
        }
        //将pivot的重合的值交换
        arr[left] = arr[l];
        arr[l] = pivot;
        //递归,先排左边,再排右边
        quick2(arr, left, r - 1);
        quick2(arr, r + 1, right);
    }

【3】测试

测试数组:int[] arr = {19, 97, 9, 17, 1, 8, 27};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值