package io.github.chenshun00.web.sort;import java.util.Arrays;/** * @author luobo.cs@raycloud.com * @since 2021/8/12 7:09 下午 */public class QuickSort { public static void main(String[] args) {// int[] array = {1, 300, 29, 490, 961, 23, 47, 50, 234, 56, 23, 56, 678, 43, 672, 356, 35, 2, 994, 67, 98, 9, 345, 76, 345, 234, 4, 2, 645, 6, 235, 3, 563}; int[] array = {100, 9, 190, 361, 2, 7, 5}; sort(array); System.out.println(Arrays.toString(array)); } public static void sort(int[] sourceArray) { quickSort(sourceArray, 0, sourceArray.length - 1); } private static void quickSort(int[] arr, int left, int right) { if (right > left) { //找到临界点 int lingJieDian = find(arr, left, right); quickSort(arr, left, lingJieDian - 1); quickSort(arr, lingJieDian + 1, right); } } /** * 目标: 找到中间点 * <p> * 1、明确开始位置(begin)、结束位置(end)、以及开始(start)的标杆数值 * <code> * 1、从开始位置+1开始处理,如果比开始大,就从后开始找比开始位置小的,然后交换. 开始位置+1,后置位置-1。 * 2、开始位置碰到结束位置的时候,就结束了 * </code> * * @param arr 待排序数组 * @param left 排序开始位置 * @param right 排序结束位置 * @return 中间点 * int[] array = {100, 9, 190, 361, 2, 7, 5}; * // 100 9 5 7 2 361 190 */ private static int find(int[] arr, int left, int right) { int end = right; int start = arr[left]; //从开始位置找到结尾 for (int i = left; i <= end; i++) { //当前位置值 final int currentStart = arr[i]; //如果大于基点位置 if (currentStart > start) { //从后往前找 for (int r = end; r >= i; r--) { //后边的值 final int currentEnd = arr[r]; //后边的值小于基点 if (currentEnd < start) { //交换 swap(arr, i, r); //向后走一下 && 继续从前往后走 end--; break; } else { //继续向后走 end--; } } } } //这里是核心,交换基点位置. 基点左边的都小于基点 & 基点右边的都大于基点 swap(arr, left, end); return end; } /** * 交换 * * @param array 数组 * @param a 低位 * @param b 高位 */ public static void swap(int[] array, int a, int b) { int temp = array[a]; array[a] = array[b]; array[b] = temp; }}