代碼:
package com.swun.AL;
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int[] nums = {5, 1, 6, 3, 7, 2, 9, 4, 0, 8};
quickSort(nums, 0, nums.length - 1);
System.out.println(Arrays.toString(nums));
}
/**
* 快排
*
* @param nums 目標排序數(shù)組
* @param left 目標數(shù)組開始角標
* @param right 目標數(shù)組最后的角標
*/
private static void quickSort(int[] nums, int left, int right) {
//角標未越界
if (left < right) {
//臨時角標
int i = left, j = right;
//臨時值
int temp = nums[i];
//當i < j 雷逆,一旦i == j是牢,退出循環(huán)
while (i < j) {
//先從右側(cè)開始比較,若當前最右側(cè)的值大于等于臨時值污淋,角標減1
while (i < j && nums[j] >= temp) {
j--;
}
//左側(cè)開始比較,若當前最左側(cè)的值小于等于臨時值慨灭,角標加1
while (i < j && nums[i] <= temp) {
i++;
}
//到了這一步坐昙,就說明右側(cè)找到了一個比臨時值小,而左側(cè)找到了一個比臨時大的值
if (i < j) {
//進行交換,將大的值放在右邊台腥,小的值放在左面
swap(nums, i, j);
}
}
//出了while循環(huán),說明i == j 绒北,因為i在++ 黎侈, j在--
//將j位置上的值賦予最左側(cè)
nums[left] = nums[j];
//此時的臨時值,還是最左側(cè)的值闷游,將最左側(cè)的值賦予j位置峻汉,也就是說將基準值與相遇值進行交換
//此時j左側(cè)都比j位置上的值小,而j右側(cè)都比j位置上的值大脐往,也就是中間值
nums[j] = temp;
//再對left到中間值角標的數(shù)組進行排序休吠,遞歸調(diào)用
quickSort(nums, left, i - 1);
//再對中間值角標到right的數(shù)組進行排序,遞歸調(diào)用
quickSort(nums, i + 1, right);
}
}
/**
* 交換值
*/
private static void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}