排序算法,(快速排序)小错误

时间:2016-02-11 07:45:19

标签: c++ sorting

所以,这是我的排序算法。输出是:

0,2,3,3,2,1,4,6,10,12,12,5,15,21,21,15,22,32,26,29,...

它很接近,但在我无法找到的地方有一个错误。每第6个数字都是错误的。

我的矢量长度是20000.所以我调用函数

quickSort(a,0,20000); //(I think it is support to be 0,20000, but I am not sure though..)

我认为这是正确的,但不确定。

template <typename Comparable>
const Comparable& median3(vector<Comparable>& a, int left, int right){
    int center=(left+right)/2;
    if(a[center]<a[left]){
        swap(a[center],a[left]);
    }
    if(a[right]<a[left]){
        swap(a[right],a[left]);
    }
    if(a[right]<a[center]){
        swap(a[right],a[center]);
    }
    swap(a[center],a[right-1]);
    return a[right-1];
}


template <typename Comparable>
void quickSort(vector<Comparable>& a, int left = 0, int right = 20000){

    if(left+10 <= right){
        const Comparable& pivot = median3(a,left,right);
        int i=left;
        int j=right-1;
        for(;;){
            while(a[++i] < pivot){}
            while(pivot < a[--j]){}
            if(i<j){
                swap(a[i],a[j]);
            }else{
                break;
            }
        }
        swap(a[i], a[right-1]);
        quickSort(a,left,i-1);
        quickSort(a,i+1,right);
    }
    else{
    //
    }

}

1 个答案:

答案 0 :(得分:0)

这一行:

if(left+10 <= right){

对我毫无意义。从本质上讲,您的例行程序并不打算对10个元素以下的子列表进行排序。

为什么呢?它是一个递归算法,需要排序到2个项目的列表才能正确完成。

正如我在评论中所说,测试从小到大的递归算法。 错误会很快弹出。