0

私は自分が正しくないことを理解しようと多くの時間を費やしてきました。デバッグとすべてを除いて、クイックソートがいくつかのソート項目を見逃している理由に私は指を置くことができないようです。

以下のソートとパーティションのコードをコピーしました。見過ごされているのは非常に明白なことだと感じていますが、コードのデバッグ、調査、書き直しに何時間も費やしてきましたが、常に同じ結果になります。

// quicksort the subarray from a[lo] to a[hi]
private void sort(Comparable[] a, int lo, int hi) {
    if((hi-lo)>1){
        int pivot = partition(a,lo,hi);
        sort(a,lo,pivot);
        sort(a,pivot+1,hi);
    }
}

// partition the subarray a[lo .. hi] by returning an index j
// so that a[lo .. j-1] <= a[j] <= a[j+1 .. hi]
private int partition(Comparable[] a, int lo, int hi) {
    //find middle
    int pivotIndex = (hi+lo)/2;
    //pick pivot
    Comparable pivot = a[pivotIndex];
    //create left and right pointers
    int left = lo, right = hi;
    //start comparing
    //compare until left passes right
    while(left<right){
        //while left is less than pivot move on
        while(a[left].compareTo(pivot) < 0) left++;
        //while right is greater than pivot move on
        while(a[right].compareTo(pivot) > 0) right--;
        //if the pointers have passed each other we're done
        //if a[left] is greater than a[right] swap them
        if(a[left].compareTo(a[right]) > 0){
            Comparable holder = a[left];
            a[left] = a[right];
            a[right] = holder;
            //increment/decrement
            left++; right--;
        }
    }
    return right;
}
4

1 に答える 1

0

を削除するだけでleft++; right--;、すべてが正常になります。

于 2013-03-22T23:54:23.757 に答える