拆分数组,以最右侧为轴,小于轴的元素数组左侧,大于轴的元素数组右侧,将轴元素移到中央。
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默认排序,双轴快排
...
浙公网安备 33010602011771号