快速排序

本文深入探讨了快速排序算法的基本实现原理,包括基准值选择、分区操作及递归调用。并通过采用插入排序替代快速排序处理小数组、随机选取基准值和三分快排等策略,进一步优化了算法性能。

在这里插入图片描述

package random;

public class quickSort {
    public static void sort(int[] a, int first, int last) {
        if (first >= last || a == null || a.length <= 1) {
            return; //每一趟结束的条件
        }
        int i = first;
        int j = last;
        int index = a[first]; // 以第一个数49作为基准
        while (i != j) {
            //从右往左扫描,找到第一个比49小的元素,并交换
            while (i < j && a[j] >= index) {
                j--;
            }
            //找到之后交换
            if (i < j) {
                a[i++] = a[j];
            }
            //从左往右扫描,找到第一个比49大的元素,并交换
            while (i < j && a[i] < index) {
                i++;
            }
            //找到之后交换
            if (i < j) {
                a[j--] = a[i];
            }
        }
        a[i] = index;

        sort(a, first, i - 1); // 对低子表进行递归排序
        sort(a, i + 1, last); // 对高子表进行递归排序
    }
}

改进思路:

  1. 分而治之时候,分到了最后,数组已经很小,这时候采用插入排序代替快速排序。

  2. 基准值的选取,随机拿出3个数,取中间大小的为基准值。

  3. 取三个变量切分数组,将数组分为大于,等于,小于基准元素三部分,这样在递归时就可以剔除相等的元素,减小比较的次数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值