为什么我的快速排序测试失败了?

时间:2017-10-15 03:02:14

标签: java sorting quicksort

我正在尝试使用三个算法的中位数来实现快速排序,并且它无法进行我编写的与小分区相关的单元测试。我改变了我之前的分区,现在它通过了其中一个用于失败的测试,但仍然无法使用底部的那个:

我的代码是:

public class QuickSort {

    static void swap(int[] A, int i, int j) {
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }

static final int LIMIT = 15;

static int partition(int[] a, int left, int right){
    int center = (left + right) / 2;
    if(a[center] < (a[left]))
        swap(a,left,center);
    if(a[right-1] < a[left])
        swap(a,left,right);
    if(a[right-1] < a[center])
        swap(a,center,right);

    swap(a,center,right - 1);
    return a[right - 1];
}


static void quicksort(int[] a, int left, int right){
    if(left + LIMIT <= right){
        int pivot = partition(a,left,right);

        int i = left;
        int j = right - 1;

        for(;;){
            while(a[++i] < pivot){}
            while(a[--j] > pivot){}
            if(i < j)
                swap(a,i,j);
            else
                break;
        }
        swap(a,i,right - 1);
        quicksort(a,left,i-1);
        quicksort(a,i+1,right);
    }
    else{
        insertionSort(a);
    }
}

public static void insertionSort(int[] a){
    int j;

    for(int p = 1; p < a.length; p++){
        int tmp = a[p];
        for(j = p; j > 0 && tmp < a[j-1]; j--)
            a[j] = a[j-1];
        a[j] = tmp;
    }
}

}

此测试失败:

  public void smalltest() throws Exception {
    int[] Arr_orig = {3,9,8,2,4,6,7,5};
    int[] Arr = Arr_orig.clone();
    int pivot = QuickSort.partition(Arr, 0, Arr.length);
    for (int i = 0; i != pivot; ++i) 
        assertTrue(Arr[i] <= Arr[pivot]); //fails!
    for (int i = pivot + 1; i != Arr.length; ++i)
        assertTrue(Arr[pivot] < Arr[i]);
}

1 个答案:

答案 0 :(得分:0)

在此序列中使用right-1和right之间存在冲突:

    if(a[right-1] < a[left])
        swap(a,left,right);

你需要决定权利是否是最后一个元素的索引,或者是最后一个元素的1 +索引(“结束”索引)。

可能还有其他问题,但这是我注意到的第一个问题。