【问题标题】:Quick Sort Error, Possibly an off by 1 C++快速排序错误,可能是关闭 1 C++
【发布时间】:2014-06-23 09:50:55
【问题描述】:

试图写一个快速排序并花了一段时间调试。问题似乎出在第二次递归调用中,但我不知道我在哪里。任何指针都会很棒。谢谢。

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

通常是后半部分的一个元素,但也不是每次都这样。可能是四分之一。

【问题讨论】:

  • 我更新了更多细节。该错误仅每隔几次发生一次。平均可能有四分之一。
  • 不是针对随机数据进行测试,而是设置单元测试来测试越来越复杂的场景。您将有更好的方法来理解和重现任何故障。如果您有一个导致错误的随机数据集,请设置一个每次都使用该数据集的测试。
  • @Bargangilo - 由于已经存在 std::list 模板类,我也会避免将您的参数命名为 list

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


【解决方案1】:

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

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

如果列表最初初始化为vector&lt;int&gt;{ 2, 1 },则第一次调用将评估为

quickSort(list, 0, 1);

对于left=0right=1,第一个if-statement 将评估为

    if(0 >= 1-1)
        return;

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

【讨论】:

  • 非常感谢。我将函数结束条件更改为if(left &gt;= right) {return;},现在每次都可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2017-04-17
  • 2018-11-06
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多