91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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
新源县| 石狮市| 都匀市| 万安县| 龙门县| 罗定市| 浙江省| 奉新县| 库车县| 胶州市| 娄烦县| 阳西县| 叶城县| 顺昌县| 色达县| 通河县| 潜山县| 武鸣县| 仁布县| 通辽市| 新丰县| 绥江县| 山东| 鄂托克旗| 文水县| 石台县| 五莲县| 龙山县| 潮州市| 扶余县| 辰溪县| 枝江市| 浮梁县| 黄浦区| 治多县| 东莞市| 建宁县| 乌苏市| 明水县| 鲁甸县| 敖汉旗|