中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

Java快速排序的代碼優化

小樊
83
2024-09-09 18:27:35
欄目: 編程語言

在Java中,實現快速排序算法的一個常見方法是遞歸。為了優化這段代碼,我們可以使用以下策略:

  1. 選擇更好的基準值(pivot):使用三數取中法或者隨機選擇基準值,這樣可以減少不平衡分區的可能性,從而提高算法的性能。
  2. 尾遞歸優化:在遞歸調用時,先處理較小的分區,這樣可以減少遞歸棧的深度,從而減少內存消耗。
  3. 當分區大小小于某個閾值時,使用簡單的排序算法(如插入排序)處理分區,這樣可以提高小規模數據集的處理速度。

下面是一個優化后的Java快速排序實現:

public class QuickSort {
    private static final int INSERTION_SORT_THRESHOLD = 47;

    public static void quickSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        quickSort(arr, 0, arr.length - 1);
    }

    private static void quickSort(int[] arr, int low, int high) {
        while (low< high) {
            if (high - low + 1 <= INSERTION_SORT_THRESHOLD) {
                insertionSort(arr, low, high);
                break;
            }
            int pivotIndex = partition(arr, low, high);
            if (pivotIndex - low< high - pivotIndex) {
                quickSort(arr, low, pivotIndex - 1);
                low = pivotIndex + 1;
            } else {
                quickSort(arr, pivotIndex + 1, high);
                high = pivotIndex - 1;
            }
        }
    }

    private static int partition(int[] arr, int low, int high) {
        int mid = low + (high - low) / 2;
        int pivot = medianOfThree(arr, low, mid, high);
        swap(arr, pivot, high);
        int i = low - 1;
        for (int j = low; j< high; j++) {
            if (arr[j] <= arr[high]) {
                i++;
                swap(arr, i, j);
            }
        }
        swap(arr, i + 1, high);
        return i + 1;
    }

    private static int medianOfThree(int[] arr, int low, int mid, int high) {
        if (arr[low] > arr[mid]) {
            swap(arr, low, mid);
        }
        if (arr[low] > arr[high]) {
            swap(arr, low, high);
        }
        if (arr[mid] > arr[high]) {
            swap(arr, mid, high);
        }
        return mid;
    }

    private static void insertionSort(int[] arr, int low, int high) {
        for (int i = low + 1; i <= high; i++) {
            int key = arr[i];
            int j = i - 1;
            while (j >= low && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }
            arr[j + 1] = key;
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

這個實現首先定義了一個閾值INSERTION_SORT_THRESHOLD,當分區大小小于這個閾值時,使用插入排序處理分區。在partition方法中,我們使用了三數取中法來選擇基準值。在遞歸調用時,我們先處理較小的分區,以減少遞歸棧的深度。

0
壶关县| 清苑县| 永顺县| 闽清县| 巴彦县| 准格尔旗| 甘孜县| 那曲县| 龙里县| 衡阳县| 包头市| 大化| 沐川县| 图木舒克市| 镇远县| 津南区| 信宜市| 凤山市| 慈溪市| 沅江市| 甘洛县| 南丹县| 仁寿县| 保康县| 韶山市| 绩溪县| 辛集市| 新晃| 同仁县| 陆良县| 南漳县| 长岛县| 蒙阴县| 繁峙县| 阿克苏市| 达孜县| 阳朔县| 木兰县| 呈贡县| 恩施市| 石景山区|