欢迎访问宙启技术站
智能推送

Java 函数实现快速排序算法及其优化策略

发布时间:2023-05-28 10:32:23

快速排序(Quick Sort)是一种基于比较的排序算法,它采用分而治之的策略,将原始数组递归地分成更小的子数组,以便进行排序。每次递归都选择一个基准元素(pivot),将数组分成两部分:小于基准元素的部分和大于基准元素的部分。然后将子数组按照同样的方式递归排序。

快速排序的核心思想是在不断缩小待排序范围的同时,保持基准元素的位置不变,这样就能减少比较的次数,提高排序效率。因此,选择合适的基准元素对快速排序的效率非常重要。一般来说,可以选择 个元素、中间元素或随机元素作为基准元素。

快速排序的时间复杂度为O(nlogn)。但是,如果选择的基准元素不合适,可能会导致快速排序的时间复杂度变为O(n^2),这是一种最坏的情况。因此,快速排序需要在实现过程中加入一些优化策略,以避免最坏情况的出现。

下面给出Java代码实现快速排序及其优化策略:

/**

 * 快速排序

 * @param arr 待排序数组

 * @param left 左边界

 * @param right 右边界

 */

public static void quickSort(int[] arr, int left, int right) {

    if (left >= right) {

        return;

    }

    // 优化1:选择中位数作为基准元素

    int mid = (left + right) >>> 1;

    if (arr[left] > arr[right]) {

        swap(arr, left, right);

    }

    if (arr[mid] > arr[right]) {

        swap(arr, mid, right);

    }

    if (arr[mid] > arr[left]) {

        swap(arr, mid, left);

    }

    int pivot = arr[left]; // 基准元素

    int i = left + 1, j = right;

    while (i <= j) {

        while (i <= j && arr[i] < pivot) {

            i++;

        }

        while (i <= j && arr[j] > pivot) {

            j--;

        }

        if (i <= j) {

            swap(arr, i++, j--);

        }

    }

    swap(arr, left, j); // 将基准元素放到正确位置

    // 优化2:递归较小的子数组,减少递归次数

    if (j - left < right - j) {

        quickSort(arr, left, j - 1);

        quickSort(arr, j + 1, right);

    } else {

        quickSort(arr, j + 1, right);

        quickSort(arr, left, j - 1);

    }

}

/**

 * 交换数组中的两个元素

 */

public static void swap(int[] arr, int i, int j) {

    int temp = arr[i];

    arr[i] = arr[j];

    arr[j] = temp;

}

上述代码中的优化策略有两个:

选择中位数作为基准元素:相比于随机选择基准元素或选择 个元素作为基准元素,选择中位数能够更加准确地划分子数组,从而减少比较次数。

递归较小的子数组:快速排序时,若子数组长度较短,则直接采用插入排序等简单排序算法进行排序,这样可以将递归树变得更加平衡,减少递归次数。

总之,快速排序是一种非常高效的排序算法,但是它也需要根据具体情况选择合适的优化策略。此外,还要注意快速排序的实现细节,如基准元素的选择、子数组边界的判断等,以保证正确性和效率。