快速排序(Quick Sort)是一种高效的排序算法,其平均时间复杂度为 O(n log n),最坏情况下为 O(n^2)。它采用分治策略,将待排序数组递归地划分成更小的子数组,直到子数组长度为 1 或 0,此时子数组已经有序。
算法步骤
快速排序算法的核心步骤如下:
- 选择基准值(Pivot):从数组中选择一个元素作为基准值,通常选择第一个、最后一个或中间的元素。
- 分区(Partition):将数组中小于基准值的元素放到基准值左边,大于基准值的元素放到基准值右边。
- 递归排序:对基准值左右两边的子数组分别递归执行步骤 1 和步骤 2,直到子数组长度为 1 或 0。
Java 代码实现
以下是一个 Java 代码示例,演示了如何使用快速排序算法对整数数组进行排序:
public class QuickSort {
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
// 分区操作,将数组分为两部分
int pivotIndex = partition(arr, low, high);
// 递归排序两个子数组
quickSort(arr, low, pivotIndex - 1);
quickSort(arr, pivotIndex + 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]
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// 交换 arr[i+1] 和 arr[high] (或基准值)
int temp = arr[i + 1];
arr[i + 1] = arr[high];
arr[high] = temp;
return i + 1;
}
public static void main(String[] args) {
int[] arr = {10, 7, 8, 9, 1, 5};
int n = arr.length;
quickSort(arr, 0, n - 1);
System.out.println("排序后的数组:");
for (int i = 0; i < n; ++i) {
System.out.print(arr[i] + " ");
}
}
}
算法分析
时间复杂度:
- 最佳情况:O(n log n),当每次分区操作都能将数组分成大小相等的两个子数组时。
- 平均情况:O(n log n)
- 最坏情况:O(n^2),当数组已经有序或逆序时,每次分区操作都会将数组分成一个大小为 n-1 的子数组和一个大小为 1 的子数组。
空间复杂度:
- 最佳情况:O(log n),递归调用栈的深度。
- 最坏情况:O(n),递归调用栈的深度。
优缺点
优点:
- 高效的平均时间复杂度。
- 原地排序,不需要额外的存储空间。
缺点:
- 最坏情况下的时间复杂度较高。
- 不稳定排序,相同元素的相对位置可能会改变。
应用场景
快速排序算法适用于以下场景:
- 对大型数据集进行排序。
- 对数据进行部分排序。
- 在其他算法中作为子程序使用。
总结
快速排序是一种高效的排序算法,它易于实现且在大多数情况下表现良好。了解其工作原理、优缺点和应用场景可以帮助开发者在实际应用中选择合适的排序算法。