文章摘要: 快速排序是一种高效的排序算法,采用分治法的一个典例。
简介
简要说明
- 快速排序是一种高效的排序算法,采用分治法的一个典例。
- 通过选取一个“基准”元素,将数组分为两个子数组,一个包含小于基准的元素,另一个包含大于基准的元素,然后递归地对这两个子数组进行快速排序。
主要功能
- 对数组进行就地排序,不需要额外的存储空间。
- 通过递归将大问题分解为小问题,并合并结果。
注意事项
- 快速排序在最坏情况下的时间复杂度为O(n^2),但通常情况下平均时间复杂度为O(n log n)。
- 选择合适的基准(pivot)对于算法的性能至关重要。
- 快速排序是不稳定的排序算法,相等的元素可能会因为排序而改变它们的相对顺序。
适用场景
- 适用于大量数据的排序,尤其是当内存空间有限时。
- 当数据不能全部载入内存时,可以考虑使用外部排序,其中快速排序是一个很好的候选算法。
时间复杂度
- 最坏情况:O(n^2)
- 平均情况:O(n log n)
空间复杂度
- O(log n),这是因为递归的深度平均为log n。
Java 8
public class QuickSort {
// 主方法调用快速排序
public static void main(String[] args) {
int[] array = {10, 7, 8, 9, 1, 5};
int n = array.length;
quickSort(array, 0, n - 1);
System.out.println("Sorted array: " + Arrays.toString(array));
}
// 快速排序方法
public static void quickSort(int[] array, int low, int high) {
if (low < high) {
// pi是划分后的索引,array[pi]现在在正确的位置
int pi = partition(array, low, high);
// 递归地分别对划分后的两个子数组进行快速排序
quickSort(array, low, pi - 1); // 递归左子数组
quickSort(array, pi + 1, high); // 递归右子数组
}
}
// 划分方法,返回划分后的索引
private static int partition(int[] array, int low, int high) {
int pivot = array[high]; // 选择最后一个元素作为基准
int i = (low - 1); // 较小元素的索引
for (int j = low; j < high; j++) {
// 如果当前元素小于或等于pivot
if (array[j] <= pivot) {
i++;
// 交换array[i]和array[j]
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
// 交换array[i+1]和array[high](或pivot)
int temp = array[i + 1];
array[i + 1] = array[high];
array[high] = temp;
return i + 1; // 返回划分后的索引
}
}
注释
在这个Java案例中,quickSort 方法实现了快速排序算法。它首先调用 partition 方法来找到基准元素的正确位置,并将数组划分为两个子数组。然后,它递归地对这两个子数组进行快速排序。partition 方法负责将数组划分为两部分,并返回基准元素的索引。