import java.util.HashMap; public class Solution { public static void main(String[] args) { quickSort(new int[]{19, 97, 9, 17, 1, 8}); } public static void quickSort(int[] arr) { quickSort(arr, 0, arr.length - 1); } public static void quickSort(int[] arr, int start, int end) { // 如果区域内的数字少于 2 个,退出递归 if (start >= end) return; // 将数组分区,并获得中间值的下标 int middle = partition(arr, start, end); // 对左边区域快速排序 quickSort(arr, start, middle - 1); // 对右边区域快速排序 quickSort(arr, middle + 1, end); } // 将 arr 从 start 到 end 分区,左边区域比基数小,右边区域比基数大,然后返回中间值的下标 public static int partition(int[] arr, int start, int end) { // 取第一个数为基数 int pivot = arr[start]; // 从第二个数开始分区 int left = start + 1; // 右边界 int right = end; while (left < right) { // 找到第一个大于基数的位置 while (left < right && arr[left] <= pivot) left++; // 找到第一个小于基数的位置 while (left < right && arr[right] >= pivot) right--; // 交换这两个数,使得左边分区都小于或等于基数,右边分区大于或等于基数 if (left < right) { exchange(arr, left, right); left++; right--; } } // 如果 left 和 right 相等,单独比较 arr[right] 和 pivot //例如交换一次之后,往后的arr[left]都小于pivot,left一直自增知道等于right,但是此时的right处的元素还没有比较过 if (left == right && arr[right] > pivot) right--; // 将基数和轴交换 exchange(arr, start, right); return right; } private static void exchange(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } }
标签:arr,right,end,start,实现,int,排序,快速,left From: https://www.cnblogs.com/luzhengqin/p/16833535.html