c++ - 鸡尾酒排序代码段错误 - 不知道为什么

标签 c++ sorting segmentation-fault

我编写了一个鸡尾酒排序算法,并通过生成大小为 500 到 10,000 的随机 vector 来测试它 - 每个 vector 运行 10 次。在大约 2000-3000 长度的 vector 标记之后,代码出现段错误。我希望这不是测试代码,因为相同的测试用于多种排序算法,并且它对于其他所有算法都运行良好。我假设在某个地方我错过了一个结束条件,并且它尝试访问输入数组中不存在的元素......但我不完全确定这是否会导致运行段错误。

这是代码,希望有人能指出我的错误。 (我也很乐意对如何改进它提出任何评论 - 但请注意,我确实更看重这段代码的可读性而不是速度。)

void Sorting::cocktailSort(vector<int>& A) {

    int temp;

    // The first/last indexes to check. Anything before/after these indexes
    // is already sorted.
    int firstIndex = -1;
    int lastIndex = A.size()-1;
    bool swapped;

    do {
        firstIndex += 1;
        swapped = false;
        for(int i = firstIndex-1; i < lastIndex; i++) {
            if(A[i] > A[i+1]) {
                temp = A[i];
                A[i] = A[i+1];
                A[i+1] = temp;
                swapped = true;
            }
        }
        if(!swapped) break;
        swapped = false;
        lastIndex -= 1;
        for(int i = lastIndex; i >= firstIndex; i--) {
            if(A[i] < A[i-1]) {
                temp = A[i];
                A[i] = A[i-1];
                A[i-1] = temp;
                swapped = true;
            }
        }
    }while (swapped);

}

不是家庭作业。

最佳答案

如果使用 A.at(i) 而不是 A[i],则会进行边界检查,并抛出超出范围的异常。这可能有助于调试。

在我看来,这里的访问...

    for(int i = firstIndex-1; i < lastIndex; i++) {
        if(A[i] > A[i+1]) {

当firstIndex为零(主循环的第一次迭代)时,将出界。

关于c++ - 鸡尾酒排序代码段错误 - 不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487532/

相关文章:

c++ - 使用 opencv 和 PlayStation Eye 进行高速视频捕获

c++ - Windows/opengl glext.h 构建问题

javascript - Dojo Enhanced Grid 嵌套排序无法排序

java - 我需要编写一个程序来打印一副洗过的牌和一副排序过的牌

c - 为什么我在 Ubuntu 上遇到段错误,但在 Mac 上却没有?

c++ - C++ 中的段错误(Eigen 库)

c - 简单程序上的非常奇怪的段错误

c++ - 带有 C++ : Can't create a DBusGProxy, 的 DBus Glib 释放它并再次创建它

c++ - 为什么 C++ 概念返回类型要求是类型约束而不是原始类型?

python - 如何按子列表的内容对子列表列表进行排序,其中子列表包含字符串和 bool 值?