C ++向量Quicksort - 似乎与不同的枢轴有不同的工作方式

时间:2016-01-02 22:58:55

标签: c++ algorithm quicksort

当我将枢轴作为第一个,最后一个或中间元素而不是其他一些值时,我的带有C ++向量的快速排序算法似乎工作正常。

我不确定所有这些,但是例如,如果我将枢轴设置为(r-l)/ 2,它将无法正确排序。

我相信我的代码是正确的,但我不确定;可能存在严重错误。

是否有时可以工作,有时甚至不工作,具体取决于枢轴?

我认为它只影响了运行时间,所以我猜我的代码出了问题。

以下是我的代码:

#include <vector>
#include <algorithm>

using namespace std;

int choosePivot(int l, int r) {
    return (r-l)/2; // or Even r/2
}

int partition(vector<int>& vec, int l, int r) {
    int pi = choosePivot(l, r); // pivot index
    int pivot = vec[pi];

    // swap pivot with the beginning
    swap(vec[pi], vec[l]); 

    // beginning index of the right side of the pivot (larger than the pivot)
    int i = l + 1;

    // partition around the pivot
    for (int j = l+1; j <= r; ++j) {
        if (vec[j] <= pivot) {
            swap(vec[i], vec[j]);
            ++i;
        }
    }

    // swap pivot back to its position
    swap(vec[l], vec[i - 1]);

    // return pivot position
    return i - 1;
}

void quicksort(vector<int>& vec, int l, int r) {
    if (l < r) {
        int p = partition(vec, l, r);
        quicksort(vec, l, p - 1);
        quicksort(vec, p + 1, r);
    }
}

int main() {

    ifstream infile("IntegerArray.txt"); 
    int a;
    vector<int> vec;
    vec.reserve(100000);
    while (infile >> a)
        vec.push_back(a);

    quicksort(vec, 0, vec.size() - 1);

    return 0;
}

我添加了一个测试示例的主函数。

这是IntegerArray.txt

这是一个包含1到100,000(不重复)的所有整数的文件。

我编辑了choosePivot函数,它将输出一个错误排序的数组。

我没有印刷品,因为尺寸太大。

1 个答案:

答案 0 :(得分:3)

在上面的代码中实现quicksort的方式,当枢轴索引不在lr之间时,它会中断。 在这种情况下,它首先从[l,r]段外引入swap(vec[pi], vec[l]);的值。 这可能会破坏数组中已经排序的部分。

现在,(r-l)/2并非始终位于lr之间。 例如,l = 10r = 20时,数据透视索引为(20-10)/2 = 5。 因此,代码将通过交换vec[5]vec[10]开始对[10,20]段进行排序。 如果具有vec[5]的部分在[10,20]段之前排序,则很可能导致数组最终未被排序。