Quicksort没有做任何事情,现在陷入了永久的循环

时间:2014-02-16 11:12:41

标签: c++ quicksort

我正在尝试实施quicksort的就地版本。这是我的代码:

#include <vector>
#include <algorithm>

using namespace std;

size_t partition(vector<int>& v, size_t l, size_t r, size_t p)
{
    size_t pivot = v[p];
    swap(v[p], v[r]);
    size_t store = l;

    for (size_t i = l; l < (r-1); i++) {
        if (v[i] <= pivot) {
            swap(v[i], v[store]);
            store++;
        }
    }
    swap(v[store], v[r]);

    return store;
}

void quickSort(vector<int>& v, size_t l, size_t r)
{
    //If two or more elements
    if(l<r)
    {
        size_t pI = l;
        size_t nP = partition(v, l, r, pI);

        quickSort(v, (nP+1), r);
        quickSort(v, l, (nP-1));
    }
}

作为参考,我正在使用in-place version on wikipedia的伪代码。

我遇到的问题是我起初意外地将列表中间的函数称为最左边的arguemtn。程序运行无错误并输出新列表,完全不变且未排序(完全没有错误)。我发现了我的错误,现在我调用了这样的函数:

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

Xcode警告我,我已经陷入了

的永久循环中
if (v[i] <= pivot)

它就在那条确切的线上,好像比较触发了一些东西。如果你能帮助我,我会很高兴的!

1 个答案:

答案 0 :(得分:1)

您的问题是您正在比较l < r - 1,但在for循环的每次迭代中递增i。因此,无限循环。将for (size_t i = l; l < (r-1); i++) {更改为for (size_t i = l; i < (r-1); i++) {