排序算法,(快速排序)小bug

Sorting algorithm, (quick sort) small bug

本文关键字:bug 快速排序 算法 排序      更新时间:2023-10-16

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

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{
    //
    }
}

这一行:

if(left+10 <= right){

对我来说毫无意义。从本质上讲,您的例程不会费心对少于 10 个元素的子列表进行排序。

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

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