亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

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
五指山市| 元氏县| 八宿县| 建昌县| 达日县| 嘉峪关市| 博爱县| 通辽市| 印江| 彰武县| 托里县| 晋城| 和顺县| 阳谷县| 丁青县| 定日县| 广南县| 清新县| 巴中市| 夹江县| 固始县| 泌阳县| 松溪县| 滁州市| 福鼎市| 峨边| 府谷县| 长沙县| 新建县| 乐都县| 武宁县| 淳化县| 广德县| 兰西县| 惠来县| 泌阳县| 宜良县| 霍州市| 南召县| 崇左市| 宁武县|