快速排序是一种高效的排序算法,它使用分治法策略把一个序列分为较小和较大的两个子序列,然后递归地排序两个子序列。
代码有三个主要部分:主函数 main、快速排序函数 quickSort 和划分函数 partition。
在 main 函数中,创建了一个未排序的整数数组作为测试数据,然后调用 quickSort 函数对数组进行排序。排序后,main 函数会打印出数组中的每个元素。
quickSort 函数是快速排序的核心。它首先检查数组的长度,如果长度小于等于 1,则函数返回,因为不需要排序。否则,通过评估数组中随机选择的一个元素作为 pivot(在代码中通过调用 swap 函数实现),将数组分成两部分:小于等于 pivot 的元素和大于 pivot 的元素。然后,quickSort 函数递归地对这两部分进行排序。
partition 函数负责将数组划分为两部分:小于等于 pivot 的元素和大于 pivot 的元素。它使用三个指针:p1、p2 和 p3。p1 指向小于等于 pivot 部分的最后一个元素,p2 用于遍历数组,p3 指向大于 pivot 部分的第一个元素。p2 从数组的最左边开始遍历,直到它到达 p3 的位置。在遍历过程中,partition 函数根据 p2 指向的元素和 pivot 的比较结果,决定是将 p2 指向的元素交换到左边还是右边。
swap 函数是一个辅助函数,用于交换数组中的两个元素。它通过临时变量 temp 来实现两个元素的交换。
public class QuickSort {
public static void main(String[] args) {
int[] arr = {4, 11, 44, 34, 8, 2, 1, 77, 49};
quickSort(arr, 0, arr.length - 1);
for (int i : arr) {
System.out.printf("%d ", i);
}
}
public static void quickSort(int[] a, int l, int r) {
if (l >= r) {
return;
}
swap(a, l + (int) (Math.random() * (r-l + 1)), r);
int[] p = partition(a, l, r);
quickSort(a, l, p[0] - 1);
quickSort(a, p[1] + 1, r);
}
public static int[] partition(int[] a, int l, int r) {
if (l == r) {
return new int[]{l, r};
}
int p1 = l - 1;
int p2 = l;
int p3 = r;
while (p2 < p3) {
if (a[p2] == a[r]) {
p2++;
} else if (a[p2] < a[r]) {
swap(a, p2++, ++p1);
} else {
swap(a, p2, --p3);
}
}
swap(a, p3, r);
return new int[]{p1 + 1, p3};
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}