繁体   English   中英

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

[英]Why is this test for my quick sort failing?

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

我的代码是:

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]);
}

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

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

您需要决定 right 是最后一个元素的索引,还是 1 + 最后一个元素的索引(“结束”索引)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM