快速排序是一种高效的排序算法,采用分治法的策略,平均时间复杂度为 (O(n \log n))。它的基本思想是选择一个基准元素(pivot),然后将待排序的数组分为两部分:左边部分的所有元素小于基准元素,右边部分的所有元素大于等于基准元素。接着,对这两部分分别递归地进行快速排序,最终合并起来得到一个有序数组。
快速排序的步骤
- 选择基准:从数组中选择一个基准元素,通常选择第一个元素、最后一个元素或随机选择一个元素。
- 分区:通过一趟排序将数组分为两部分,左侧小于基准,右侧大于等于基准,并返回基准的位置。
- 递归排序:对左侧和右侧的子数组分别递归调用快速排序。
Java实现
下面是一个简单的Java代码实现快速排序的示例:
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// 获取分区点
int partitionIndex = partition(arr, low, high);
// 递归排序左半边
quickSort(arr, low, partitionIndex - 1);
// 递归排序右半边
quickSort(arr, partitionIndex + 1, high);
}
}
private static int partition(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++;
// 交换arr[i]和arr[j]
swap(arr, i, j);
}
}
// 将基准元素放到正确的位置,将大于基准的元素移到右边
swap(arr, i + 1, high);
return i + 1; // 返回基准的索引
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
int n = arr.length;
System.out.println("原始数组:");
printArray(arr);
quickSort(arr, 0, n - 1);
System.out.println("排序后的数组:");
printArray(arr);
}
private static void printArray(int[] arr) {
for (int num : arr) {
System.out.print(num + " ");
}
System.out.println();
}
}
代码解析
quickSort
方法首先检查当前数组部分如果有元素(即low < high
),则继续进行排序。- 调用
partition
方法进行分区,并返回基准元素的位置。 - 然后对基准元素左右的子数组递归调用
quickSort
进行排序。 partition
方法实现了分区逻辑:遍历数组,将比基准小的元素移到左边,将基准元素放到正确的位置。swap
方法用于交换数组中的两个元素。
总结
快速排序是一种非常有效的排序算法,尽管在最坏情况下(例如数组已经是有序的情况下)时间复杂度为 (O(n^2)),但在大多数情况下,平均时间复杂度为 (O(n \log n))。此外,快速排序通常是原地排序,这意味着它只需要常数级的额外空间,因而在实际应用中使用广泛。理解并掌握快速排序的原理和实现,对于学习数据结构和算法是非常重要的一步。