04--快速排序

/**
 * @author zzw
 * @create 2021/04/11-16:31
 */
//将一组数据分半,前面的都比中间的数小,后面的都比中间的大,然后在将前面的分半,后面的分半,重复
public class test {
    public static void main(String[] args) {
        int[] arr = {1, 4, 5, 67, 7, 3, 8, 6, 9, 44};
        quickSort(arr, 0, 9);
        //遍历输出
        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
    public static void quickSort(int[] arr, int L, int R) {
        int i = L;
        int j = R;
        //⽀点
        int pivot = arr[(L + R) / 2];
        //左右两端进⾏扫描,只要两端还没有交替,就⼀直扫描
        while (i <= j) {
            //左边寻找直到⽐⽀点⼤的数
            while (pivot > arr[i]) {
                i++;
            }
            //右边寻找直到⽐⽀点⼩的数
            while (pivot < arr[j]) {
                j--;
            }

            //1.当我们分别找到了⽐⽀点⼤的数(左边)和⽐⽀点⼩的数(右边),将它们进⾏交换 ,执行完后接着 while 循环
            //2.或者找不到,只找到一边,另一边因为i++循环最后会变成支点下标,就将最初支点和另一个值交换,执行完后接着 while 循环
            //直到做左边i++和右边j--交替了,就退出 while 循环
            if (i <= j) {           //i=3,j=7    i=4,j=5
                int temp = arr[i];  //67         7
                arr[i] = arr[j];    //67=6       7=3
                arr[j] = temp;      //6=67       3=7
                i++; j--;           //将6和67交换了位置然后接着判断i的后一个和j的前一个   4,6.     将3和7交换了位置 5,4
            }
        }
        //原:int[] arr = {1, 4, 5, 67, 7, 3, 8, 6, 9, 44};
        //第一次if:1 4 5 6 7 3 8 69 9 44
        //第二次if:1 4 5 6 3 7 8 69 9 44
        //上⾯⼀个while保证了第⼀趟排序⽀点的左边⽐⽀点⼩,⽀点的右边⽐⽀点⼤了。
        // “左边”再做排序,直到左边剩下⼀个数(递归出⼝)   递归重复上面的动作
        if (L < j) {       //第一次 0<4  ...
            quickSort(arr, L, j);
        }
        //“右边”再做排序,直到右边剩下⼀个数(递归出⼝)   递归重复上面的动作
        if (i < R) {       //第一次 5<9  ...
            quickSort(arr, i, R);
        }
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值