簡體   English   中英

如何修復重復的快速排序算法

[英]How do i fix my duplicating QuickSort algorithm

我在弄清楚以下快速排序有什么問題時遇到了一些問題。 存在問題,它沒有正確排序所有內容,甚至看起來像重復數字

public static List<Archer> quickSort(List<Archer> archers, Comparator<Archer> scoringScheme) {
        var sortedArray = archers.toArray(new Archer[archers.size()]);
        quickSort(sortedArray, 0, archers.size(), scoringScheme);
        return Arrays.asList(sortedArray);


    }
 private static void quickSort(Archer[] array, int min, int max, Comparator<Archer> scoringScheme) {
        if (min >= max - 1) {
            return;
        }
        int pivot = (min + max) / 2;
        var pivotItem = array[pivot];
        var lowerIndex = min;
        var higherIndex = max - 1;
        while (lowerIndex <= higherIndex) {
            while (lowerIndex <= higherIndex && scoringScheme.compare(array[lowerIndex], pivotItem) <= 0) {
                lowerIndex++;
            }
            while (higherIndex >= lowerIndex && scoringScheme.compare(array[higherIndex], pivotItem) >= 0) {
                higherIndex--;
            }
            if (lowerIndex < higherIndex) {
                var temp = array[lowerIndex];
                array[lowerIndex] = array[higherIndex];
                array[higherIndex] = temp;
                lowerIndex++;
                higherIndex--;
            }
        }
        if (lowerIndex > pivot) {
            lowerIndex--;
            array[pivot] = array[lowerIndex];
            array[lowerIndex] = pivotItem;
        } else {
            higherIndex++;
            array[pivot] = array[higherIndex];
            array[higherIndex] = pivotItem;
        }
        quickSort(array, min, lowerIndex , scoringScheme);
        quickSort(array, higherIndex +1, max, scoringScheme);

    }

結果如下:

Expected [135810 ( 187 / 217), 135810 ( 184 / 214), 135810 ( 183 / 213), 135810 ( 179 / 209), 135810 ( 177 / 207), 135810 ( 176 / 206), 135810 ( 170 / 200), 135810 ( 167 / 197), 135810 ( 167 / 197), 135810 ( 165 / 195), 135810 ( 162 / 192), 135810 ( 161 / 191), 135810 ( 161 / 191), 135810 ( 158 / 188), 135810 ( 158 / 188), 135810 ( 151 / 181), 135810 ( 151 / 181), 135810 ( 150 / 180), 135810 ( 147 / 177), 135810 ( 147 / 177), 135810 ( 146 / 176), 135810 ( 140 / 170), 135810 ( 138 / 168)]
Actual [135810 ( 187 / 217), 135810 ( 187 / 217), 135810 ( 184 / 214), 135810 ( 179 / 209), 135810 ( 177 / 207), 135810 ( 176 / 206), 135810 ( 176 / 206), 135810 ( 167 / 197), 135810 ( 167 / 197), 135810 ( 165 / 195), 135810 ( 165 / 195), 135810 ( 162 / 192), 135810 ( 162 / 192), 135810 ( 158 / 188), 135810 ( 158 / 188), 135810 ( 158 / 188), 135810 ( 158 / 188), 135810 ( 151 / 181), 135810 ( 151 / 181), 135810 ( 150 / 180), 135810 ( 150 / 180), 135810 ( 147 / 177), 135810 ( 147 / 177)]

這是快速排序實現的一個簡單示例:

https://www.baeldung.com/java-quicksort

為了避免重復值,你能不使用 Set 接口的實現之一而不是 List 接口嗎?如果是這樣,只需實現 Archer object 的equalshashcode方法。

沒有調用代碼,我不確定參數。 建議的更改在評論中注明。 如果外部調用是

    quickSort(array, 0, length-1, compare);

這將消除代碼中對 max-1 的需要。

 private static void quickSort(Archer[] array, int min, int max, Comparator<Archer> scoringScheme) {
        if (min >= max - 1) {
            return;
        }
        int pivot = (min + max) / 2;        // may need to be (min+max-1)/2
        var pivotItem = array[pivot];
        var lowerIndex = min;
        var higherIndex = max - 1;
        while (lowerIndex <= higherIndex) {
            while (scoringScheme.compare(array[lowerIndex], pivotItem) < 0) {  // change
                lowerIndex++;
            }
            while (scoringScheme.compare(array[higherIndex], pivotItem) > 0) { // change
                higherIndex--;
            }
            if (lowerIndex <= higherIndex) {                // change (<=)
                var temp = array[lowerIndex];
                array[lowerIndex] = array[higherIndex];
                array[higherIndex] = temp;
                lowerIndex++;
                higherIndex--;
            }
        }
        // change ... deleted 9 lines
        quickSort(array, min, higherIndex+1 , scoringScheme);  // change
        quickSort(array, lowerIndex, max, scoringScheme);      // change

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM