STATUS_ACCESS_VIOLATION处于3向快速排序(C++)

STATUS_ACCESS_VIOLATION at 3-way quicksort (C++)

本文关键字:快速排序 C++ ACCESS VIOLATION 处于 STATUS      更新时间:2023-10-16

我尝试在C++中实现这里描述的三向快速排序算法。不幸的是,我得到了异常STATUS_ACCESS_VIOLATION。

template<typename T, size_t SIZE>
void qsort(std::array<T, SIZE> &a, std::size_t lo, std::size_t hi) {
    if (hi <= lo) {
        return;
    }
    std::size_t lt = lo, gt = hi;
    T v = a[lo];
    std::size_t i = lo;
    while (i <= gt) {
        if (a[i] < v) {
            std::swap(a[lt++], a[i++]);
        } else if (a[i] > v) {
            std::swap(a[i], a[gt--]);
        } else {
            i++;
        }
    }
    qsort(a, lo, lt - 1);
    qsort(a, gt + 1, hi);
}
template<typename T, size_t SIZE>
void quickSortThreeWay(std::array<T, SIZE> &a) {
    std::size_t arraySize = sizeof(a) / sizeof(a[0]);
    qsort(a, 0, arraySize - 1);
}

该数组是一个std::数组,我用随机值填充。这与其他算法配合得很好。

你能帮我找出问题吗?谢谢

谢谢。

在这行代码处:

qsort(a, lo, lt - 1);

当lo为0时,lt可以为-1。不幸的是,你的签名不允许负数,因为你使用的是size_t,所以在我的测试中,当lo为0时,lt-1为18446744073709551615。然后这个测试无法完成你想要的:

if (hi <= lo) { return }

然后它盲目地继续下去并崩溃。您可能会考虑在方法签名中允许负数,而不是size_t,例如:

void qsort(std::array<T, SIZE> &a, int lo, int hi) {
    std::cout << "qsort (a, " << lo << ", " << hi << ")" << std::endl;

当我对三个字符串的数组运行上面修改的签名时:

std::array<std::string, 3> a;
a[0] = "hello";
a[1] = "abacus";
a[2] = "goodbye";
quickSortThreeWay (a);

最后一个参数为-1:

qsort (a, 0, 2)
qsort (a, 0, 1)
qsort (a, 0, -1)
qsort (a, 1, 1)
qsort (a, 3, 2)