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);
}
}
3、排序:快速排序
于 2020-10-26 17:22:20 首次发布