![](/img/trans.png)
[英]How do I fix my quicksort algorithm for larger values of n ? ( and when the array is not random)
[英]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 的equals和hashcode方法。
沒有調用代碼,我不確定參數。 建議的更改在評論中注明。 如果外部調用是
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.