Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 快速排序三向分区+;混合实现_Java_Quicksort_Hybrid - Fatal编程技术网

Java 快速排序三向分区+;混合实现

Java 快速排序三向分区+;混合实现,java,quicksort,hybrid,Java,Quicksort,Hybrid,我正在尝试使用混合快速排序实现三向分区快速排序。问题是我在最后得到了一个无序的列表。我已经单独测试了混合快速排序和插入排序,它们工作得非常好(测试大小:10、50、500、1000、5000)。我运行debug,但仍然无法判断问题是什么。先谢谢你。这是代码 public <T> void sort(@NotNull Comparator<T> comparator, @NotNull List<T> list) { int lo = 0; in

我正在尝试使用混合快速排序实现三向分区快速排序。问题是我在最后得到了一个无序的列表。我已经单独测试了混合快速排序和插入排序,它们工作得非常好(测试大小:10、50、500、1000、5000)。我运行debug,但仍然无法判断问题是什么。先谢谢你。这是代码

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 void排序(@NotNull Comparator Comparator、@NotNull List List){
int-lo=0;
int hi=list.size()-1;

如果(hi如果我理解您在第一个
排序
方法(公共方法)中进行分区的意图,
lt
指向您正在进行分区的元素。因此,在比较时,您应该将
I
处的元素与
lt
处的元素进行比较,而不是将
lo
处的元素进行比较:

    if (comparator.compare(list.get(i), list.get(lt)) < 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(lt)) > 0)
        exch(list, i, gt--);

在本例中,
gt
指向元素
3
,但在列表的更右边有一个
2

我可以运行您的代码,看看是否遇到任何问题。要做到这一点,我需要剩下的部分,如InsertionSort、exch()和partition()。同样在
排序(Comparator、list)中
,什么是
j
?我发现问题一定出在第一个公共方法中,因为我尝试使用所述方法使用另一个快速排序对其进行排序,结果得到了相同的无序列表。
    if (comparator.compare(list.get(i), list.get(lt)) < 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(lt)) > 0)
        exch(list, i, gt--);
    T v = list.get(lt);
    for (int ix = lo; ix < lt; ix++) {
        assert comparator.compare(list.get(ix), v) < 0 : "lt " + lt + ' ' + list;
    }
    for (int ix = lt; ix <= gt; ix++) {
        assert comparator.compare(list.get(ix), v) == 0 : "lt " + lt + " gt " + gt + ' ' + list;
    }
    for (int ix = gt + 1; ix <= hi; ix++) {
        assert comparator.compare(list.get(ix), v) > 0 : "gt " + gt + ' ' + list;
    }
Exception in thread "main" java.lang.AssertionError: gt 2 [1, 0, 3, 6, 4, 8, 9, 5, 2, 7, 10]