手写快速排序:
package com.atguigu.react2024; import java.util.Arrays; public class QuicklySort { public static void main(String[] args) { int[] arr = {9, 5, 8, 7, 2, 3, 6,3, 4, 1, 10}; quickSort(arr, 0, arr.length - 1); // Arrays.sort(arr); System.out.println(Arrays.toString(arr)); } /** * 逻辑:会先把这个数组中的一个数当作基准数,一般会把数组的最左边的数当作基准数。 * 然后从两边进行检索。先从右边检索比基数小的,再从左边检索比基数大的。 * 如果检索到了,就停下,然后交换两个元素。然后再继续下去。 * @param arr * @param left * @param right */ public static void quickSort(int[] arr, int left, int right) { //如果左边索引比右边索引大,是不合法,直接返回 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 && j > i) { 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] = base; //基准数在这里就归位了,左边的数都比它小,右边的数都比它大 //排基数的左边 quickSort(arr, left, i - 1); //排基数的右边 quickSort(arr, j + 1, right); } }
标签:检索,arr,right,int,基准,排序,快速,left From: https://www.cnblogs.com/odada/p/18133494