牛叔叔 的笔记

好好学习

2024-09-22 14:06

Java实现快速排序

牛叔叔

JavaEE

(497)

(0)

收藏

Java中的快速排序(Quick Sort)是一种非常高效的排序算法,它采用分治法的策略来把一个序列分为两个子序列,再从子序列中继续这个过程,直到整个序列有序。快速排序的基本思想是:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

快速排序的基本步骤:

  1. 选择基准值(Pivot):从待排序的数组中选取一个元素作为基准值。

  2. 分区(Partitioning):重新排列数组,所有比基准值小的元素摆放在基准值前面,所有比基准值大的元素摆放在基准值的后面(相同的数可以到任一边)。在这个分区退出之后,该基准值就处于数组的中间位置。这个称为分区(partition)操作。

  3. 递归排序子数组:递归地将小于基准值元素的子数组和大于基准值元素的子数组排序。

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条评论

点击登录参与评论