3、排序:快速排序

package com.zjl.排序;

import java.util.Arrays;

/**
 * Created by zjl 2022/5/10
 **/
public class 快速排序 {

  public static void main(String[] args) {
    // 定义一个数组
    int[] arr = { 6, 3, 7, 9, 5, 1, 4, 8 };
    quickSort(arr, 0, arr.length - 1);
    System.out.println(Arrays.toString(arr));
  }

  /**
   * 定义方法,用来进行快速排序
   *
   * @param arr
   *     需要排序的数组
   * @param left
   *     需要排序的数组的左下标
   * @param right
   *     需要排序的数组的右下标
   */
  public static void quickSort(int arr[], int left, int right) {
    // 进行判断,如果左边索引比右边索引大,是不合法的,直接用return结束这个方法
    if (left > right) {
      return;
    }
    // 定义变量保存基准数
    int base = arr[left];
    // 定义变量i,指向最左边
    int i = left;
    // 定义变量j,指向最右边
    int j = right;

    // 当i和j不相遇的时候,在循环中进行检索
    while (i != j) {
      // 先由j从右往左检索比基准数小的,如果检索到比基准书小的,就停下
      // 如果检索到的比基准数大或者相等的,就继续检索。
      while (arr[j] > base && i < j) {
        j--; // j从右往左移动
      }
      // i从左往右检索
      while (arr[i] <= base && i < j) {
        i++; // i从左往右移动
      }

      //代码走到这里。i停下了,j也停下了。然后交换i和j位置的元素。
      int temp = arr[i];
      arr[i] = arr[j];
      arr[j] = temp;
    }

    //如果上面while循环的条件不成立,会跳出这个循环,往下执行。
    //如果这个条件不成立,说明i和j相遇了。
    //如果i和j相遇了,就交换基准数这个元素和相遇位置元素。
    //把相遇位置的元素赋值给基准数这个位置上的元素。
    arr[left] = arr[i]; // 这里用arr[i]和arr[j]都可以
    //把基准数赋值给相遇位置的元素。
    arr[i] = base;

    //基准数这里就归位了,左边的数字都比他小,右边的数字都比他大。
    //排基准数的左边
    quickSort(arr, left, i - 1);
    //排基准数的右边
    quickSort(arr, j + 1, right);
  }


}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值