一、思想
-
选取基准(Pivot): 选择数组中的一个元素作为基准值(通常选最左、最右或随机选取)。
-
分区(Partition):
-
设定两个指针
i
(左指针)和j
(右指针),分别从数组两端向中间移动。 -
i
向右移动,直到找到一个比基准值大的元素; -
j
向左移动,直到找到一个比基准值小的元素; -
交换
i
和j
位置的元素,重复以上过程,直到i >= j
。 -
此时基准值与
j
位置的元素交换,使基准值左侧的元素 ≤ 基准值,右侧的元素 ≥ 基准值。
-
-
递归(Recursion): 对基准值左侧和右侧的子数组分别递归执行相同的排序过程,直到子数组长度为1或0,排序完成。
这个过程的核心是 分治(Divide and Conquer),快速排序的平均时间复杂度为 O(n log n),最坏情况(如每次都选取最小或最大元素为基准)为 O(n²)。
二、代码
public class quickSortTest {
public static void main(String[] args) {
int[] arr = {5,1,78,23,1,6,9,4};
quickSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
int i, j, temp, t;
if (left > right){
return;
}
i = left;
j = right;
temp = arr[left];
while (i < j) {
while (arr[j] >= temp && i < j) {
j--;
}
while (arr[i] <= temp && i < j) {
i++;
}
if (i < j) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[i];
arr[i] = temp;
quickSort(arr, left, j - 1);
quickSort(arr, j + 1, right);
}
}