Java中的快速排序(Quick Sort)是一种非常高效的排序算法,它采用分治法的策略来把一个序列分为两个子序列,再从子序列中继续这个过程,直到整个序列有序。快速排序的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
快速排序的基本步骤:
选择基准值(Pivot):从待排序的数组中选取一个元素作为基准值。
分区(Partitioning):重新排列数组,所有比基准值小的元素摆放在基准值前面,所有比基准值大的元素摆放在基准值的后面(相同的数可以到任一边)。在这个分区退出之后,该基准值就处于数组的中间位置。这个称为分区(partition)操作。
递归排序子数组:递归地将小于基准值元素的子数组和大于基准值元素的子数组排序。
Java实现快速排序:
public class QuickSort { // 快速排序方法 public static void quickSort(int[] arr, int low, int high) { if (low < high) { // pi是分区操作后基准值的正确位置 int pi = partition(arr, low, high); // 递归地对基准值左边的子数组进行快速排序 quickSort(arr, low, pi - 1); // 递归地对基准值右边的子数组进行快速排序 quickSort(arr, pi + 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; } } // 将基准值交换到中间位置 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}; quickSort(arr, 0, arr.length - 1); System.out.println("Sorted array: "); for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); System.out.println(); } }
注意事项:
基准值的选择:在上面的实现中,我们选择了最右边的元素作为基准值。然而,基准值的选择对快速排序的性能有很大影响。在实际应用中,可能会选择其他策略来选择基准值,如随机选择、三数取中法等,以避免最坏情况的发生。
稳定性:快速排序是不稳定的排序算法,即相等的元素可能在排序后的序列中改变顺序。
时间复杂度:平均时间复杂度为,但最坏情况下的时间复杂度为,这通常发生在数组已经接近有序或完全有序时。通过合理选择基准值,可以尽量避免这种情况。
空间复杂度:快速排序是原地排序,其空间复杂度主要取决于递归的深度,最坏情况下为,平均情况下为。然而,在迭代版本的快速排序中,可以进一步减少空间复杂度到。
0条评论
点击登录参与评论