ハイブリッドクイックソートを使用してスリーウェイパーティションクイックソートを実装しようとしています。問題は、最後に順序付けられていないリストを取得していることです。私はHybrid QuickSortとInsertion Sortを独自にテストしており、完全に機能しています(サイズのテストは10,50,500,1000,5000)。私はデバッグを実行し、問題の内容をまだ知ることができません。前もって感謝します。ここにコードがあります。クイックソート3ウェイパーティション+ハイブリッド実装
public <T> void sort(@NotNull Comparator<T> comparator, @NotNull List<T> list) {
int lo = 0;
int hi = list.size() - 1;
if (hi <= lo) return;
int lt = lo, i = lo+1, gt = hi;
while (i <= gt) {
if (comparator.compare(list.get(i), list.get(lo)) < 0) //did not use AbstractSorter greter in order to check all cases.
exch(list, lt++, i++);
else if(comparator.compare(list.get(i), list.get(lo)) > 0)
exch(list, i, gt--);
else
i++;
} // Now a[lo..lt-1] < v = a[lt..gt] < a[gt+1..hi].
sort(comparator, list, lo, lt - 1);
sort(comparator, list, gt + 1, hi);
}
private <T> void sort(@NotNull Comparator<T> comparator, @NotNull List<T> list, int lo, int hi){
if(hi <= lo) return;
if(hi - lo <= 8){
InsertionSort sorter = new InsertionSort();
sorter.sort(comparator, list.subList(lo, hi + 1));
List<SorterListener> listeners = (ArrayList)sorter.getListeners();
for(SorterListener s: listeners)
getListeners().add(s);
return;
}
int i = partition(comparator, list, lo, hi);
sort(comparator, list, lo, i - 1);
sort(comparator, list, i + 1, hi);
}
編集:
public <T> void exch(@NotNull List<T> list, int i, int j) {
final T aux = list.get(i);
list.add(i, list.get(j));
list.remove(i + 1);
list.add(j, aux);
list.remove(j + 1);
listeners.get(0).swap(i, j);
}
public <T> int partition(@NotNull Comparator<T> comparator, @NotNull List<T> list, int lo, int hi) {
int i = lo - 1;
int j = hi;
while(true) {
while(greater(list, hi, ++i, comparator)) //find item left to swap
if (i == hi) break;
while(greater(list, --j, hi, comparator)) //find item right to swap
if (j == lo) break;
if (i >= j) break; //check if pointers cross
exch(list, i, j); //swap
}
exch(list, i, hi); //swap with partitioning item
return i; //return index of item now known to be in place
}
私のコードを実行して、何かにつまずくかどうかはわかります。そのためには、InsertionSort、exch()、partition()などの残りの部分が必要になります。 –
'ソート(コンパレータ、リスト)'では、 'j'とは何ですか? –
私は、上記の方法を使って別のクイックソートでソートしようとしたときに、問題が最初のパブリックメソッドでなければならないことを発見しました。 –