拆分数组,以最右侧为轴,小于轴的元素数组左侧,大于轴的元素数组右侧,将轴元素移到中央。
public class QuickSort { public static void main(String[] args) { int[] arr = {7, 3, 2, 8, 1, 9, 5, 4, 6}; sort(arr, 0, arr.length - 1); print(arr); } /** * 快速排序 * * @param arr */ private static void sort(int[] arr, int leftBound, int rightBound) { partition(arr, leftBound, rightBound); } private static void partition(int[] arr, int leftBound, int rightBound) { int pivot = arr[rightBound];// 杠杆元素,最右侧元素 int left = leftBound; // 左侧开始元素 int right = rightBound - 1; // 右侧开始元素 while (left < right) { while (left < right && arr[left] <= pivot) { left++; } while (left < right && arr[right] >= pivot) { right--; } if (left < right) { swap(arr, left, right); } } swap(arr, left, rightBound); } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i : arr) { System.out.print(i + " "); } } }
加入递归处理
package com.example.sort.quick; public class QuickSort { public static void main(String[] args) { int[] arr = {7,3,2,10,8,1,9,5,4,6}; sort(arr, 0, arr.length - 1); print(arr); } /** * 快速排序 * * @param arr */ private static void sort(int[] arr, int leftBound, int rightBound) { if (leftBound >= rightBound) return; int mid = partition(arr, leftBound, rightBound); sort(arr, leftBound, mid - 1); sort(arr, mid + 1, rightBound); } private static int partition(int[] arr, int leftBound, int rightBound) { int pivot = arr[rightBound];// 杠杆元素,最右侧元素 int left = leftBound; // 左侧开始元素 int right = rightBound - 1; // 右侧开始元素 while (left <= right) { while (left <= right && arr[left] <= pivot) { left++; } while (left <= right && arr[right] > pivot) { right--; } if (left < right) { swap(arr, left, right); } } swap(arr, left, rightBound); return left; } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } private static void print(int[] arr) { for (int i : arr) { System.out.print(i + " "); } } }
java默认排序,双轴快排
...