文章目录
快速排序的多种实现方式
快速排序(Quick Sort)是一种高效的排序算法,采用分治法策略。它通过选择一个“基准”元素,将数组分割成两个子数组,并递归地对这两个子数组进行排序。本文将详细介绍几种常见的快速排序实现方式,并讨论它们的特点和适用场景。

1. 基本快速排序(Lomuto 分区方案)
1.1 基本原理
Lomuto 分区方案是最常见的快速排序实现之一。它选择数组的最后一个元素作为基准(pivot),然后重新排列数组,使得所有小于基准的元素位于基准的左侧,所有大于基准的元素位于基准的右侧。
1.2 步骤
- 选择基准:通常选择数组的最后一个元素作为基准。
- 初始化指针:设置一个指针
i,用于追踪当前小于基准的最后一个元素的位置。 - 遍历数组:
- 遍历数组中的每个元素(除了基准元素),如果当前元素小于等于基准,则将该元素与
i指针所指向的元素交换,并将i向右移动一位。
- 遍历数组中的每个元素(除了基准元素),如果当前元素小于等于基准,则将该元素与
- 放置基准:最后将基准元素与
i + 1位置的元素交换,使得基准元素处于正确的位置。 - 递归排序:对基准两侧的子数组分别递归执行上述过程,直到每个子数组只剩下一个元素或为空。
1.3 Java 实现示例
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
private static void quickSort(int[] arr, int low, int high) {
if(low >= high) {
return;
}
int pivotIndex = lomuto(arr, low, high);
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 1, high);
}
private static int lomuto(int[] arr, int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为基准
int i = low - 1; // 指向当前小于基准的最后一个元素
for (int j = low; j < high; j ++) {
if(arr[j] <= pivot) {
i ++;
if(i != j) {
swap(arr, i, j);
System.out.println(low + "|" + high + " " + i + "|" + j + " " + Arrays.toString(arr));
}
}
}
// 将基准元素放回数组正确位置
swap(arr, i + 1, high);
System.out.println(low + "|" + high + "\t \t" + Arrays.toString(arr));
return i + 1;
}
/**
* 交换数组索引为i和j的两个元素
* @param arr
* @param i
* @param j
*/
private static void swap(int[]

最低0.47元/天 解锁文章
18万+

被折叠的 条评论
为什么被折叠?



