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

快排基本原理

基本步骤

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

②然后定义两个游标,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

你可能感兴趣的:(算法)