快速排序错误,可能是1 C ++的关闭

时间:2014-05-06 16:52:06

标签: c++ quicksort off-by-one

尝试编写快速排序并花了一些时间进行调试。问题似乎出现在第二次递归调用中,但我无法弄清楚我在哪里。任何指针都很棒。感谢。

void quickSort(vector<int> &list, int left, int right){

    int pivot = left;
    int temp = right;

    if(left >= right - 1)
        return;

    while (left != right) {
        if (pivot == left){
            if (list[pivot] > list[right]) {
                //-------------------------
                int tempList = list[right];
                list[right] = list[pivot];   // Swap for now
                list[pivot] = tempList;
                //-------------------------
                pivot = right;
                left++;
            }else{
                right--;
            }

        }else{
            if (list[pivot] < list[left]) {
                //-------------------------
                int tempList = list[left];
                list[left] = list[pivot];   // Swap for now
                list[pivot] = tempList;
                //-------------------------
                pivot = left;
                right--;
            }else{
                left++;
            }
        }
    }
    quickSort(list, 0, right-1);
    quickSort(list, right + 1, temp);
}

这就是我现在正在制作数据的方式:

srand(time(0));
vector<int> list;
vector<int> sortedList;
int i;
for (i=0;i<10;i++) list.push_back(rand() %100);

我的数据集为38 65 26 22 86 64 13 28 57 18

并得到13 18 22 26 28 38 57 64 86 65

的输出

它通常是后半部分的一个元素,但它也不是每次都有。也许四分之一。

1 个答案:

答案 0 :(得分:0)

由于您要访问位置rightleft的元素,我假设初始调用如下:

quickSort(list, 0, list.size()-1);

如果列表最初初始化为vector<int>{ 2, 1 },则第一个呼叫将评估为

quickSort(list, 0, 1);

left=0right=1第一个if语句将评估为

    if(0 >= 1-1)
        return;

并且函数将在不交换两个元素的情况下返回,即使列表明显未排序。