【重温篇】八大排序——快速排序

快排基本原理

基本步骤

①首先定义第一个数作为基准数

②然后定义两个游标,i游标指向数组第一个,j游标指向数组最后一个

③让j游标找比当前基准数小的,找到后停下来

④让i游标找比当前基准数大的,找到后停下来

⑥相遇之后,让相遇位置的数和基准数互换

一轮下来,让一个数变的有序

递归的过程

  • 该排序采用递归的方式实现
  • 拆分的过程就是一个递归的过程
  • 递归结束的状态就是叶子节点的状态(left = right)

为什么要让j游标先动【注意一定要让基准数对面的哨兵先移动】

如果选取最左边的数arr[left]作为基准数,那么先从右边开始可保证i,j在相遇时,相遇数是小于基准数的,交换之后base所在位置的左边都小于base。但先从左边开始,相遇数是大于基准数的,无法满足base左边的数都小于它。所以进行扫描,要从基准数的对面开始。

注意while循环嵌套while循环的执行方式

当满足内外循环的条件时,开始执行内循环【注意这里外层while循环的条件只执行了一次】,内循环结束,再次判断外循环条件,决定是否继续执行循环。

上源码!

public class QuickSort {
    public static void main(String[] args) {
        int[] arr = new int[] {8,5,4,3,6,89,0,6}; 
        quickSort(arr,0,arr.length-1,0,arr.length-1);
        System.out.println(Arrays.toString(arr));
    }

    public static void quickSort(int[] arr,int left,int right,int i ,int j){
        if(left>=right){
            return;
        }
        //定义第一个数为基准数
        int base = arr[left];
        i = left;
        j = right;
        
        while(i != j) {
            //j游标找到比当前基准数小的停下来
            while(arr[j]>=base  && i<j) {
                j--;
            }
            // i游标要去找比当前基准数大的停下啦
            while (arr[i]<=base && i<j) {
                i++;
            }
            
            //交换
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        // i和 j相遇 ,基准数和相遇位置的数进行交换
        arr[left] = arr[i];
        arr[i] = base;
        
        quickSort(arr,left,i-1,i,j);
        quickSort(arr,i+1,right,i,j);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值