【问题标题】:runtime error after running bubble sort运行冒泡排序后的运行时错误
【发布时间】:2018-01-29 05:23:03
【问题描述】:

我正在尝试编写一个对数组进行冒泡排序的程序,但每次运行时都会弹出此错误:runtime error: index 4 out of bounds for type 'int [e]'

这里有什么问题?

int main(void) {
    printf("How many elements are there in the array?: ");
    int e = get_int();

    int array[e];

    for (int i = 0; i < e; i++) {
        printf("Insert element #%i: ", i + 1);
        array[i] = get_int();
    }

    for (int i = 0; i < e - 1; e++) {
        for (int j = 0; j < e - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                int swap = array[j];
                array[j] = array[j + 1];
                array[j + 1] = swap;
            }
        }
    }
    printf("\n");
}

【问题讨论】:

  • 认真的吗?您觉得该错误消息令人困惑吗?
  • 请展示您迄今为止的研究/调试工作。请先阅读How to Ask页面。
  • 请阅读如何生成minimal reproducible example - 您还需要提供所有输入和预期输出!
  • 看起来像i ==0,` if(array[j] > array[j + 1])`,最后一次迭代会导致问题....用笔和纸检查。
  • 您的运行时非常好。其他人会出现“运行时错误,代码 0x232532464 - 下地狱”...

标签: c arrays runtime-error bubble-sort


【解决方案1】:

您输入错误的 for 循环增量部分:for (int i = 0; i &lt; e - 1; e++) 应该是:

for (int i = 0; i < e - 1; i++)

这是一个更正的版本:

#include <stdio.h>

int main(void) {
    printf("How many elements are there in the array?: ");
    int e = get_int();

    for (int i = 0; i < e; i++) {
        printf("Insert element #%i: ", i + 1);
        array[i] = get_int();
    }

    for (int i = 0; i < e - 1; i++) {
        for (int j = 0; j < e - i - 1; j++) {
            if (array[j] > array[j + 1]) {
                int swap = array[j];
                array[j] = array[j + 1];
                array[j + 1] = swap;
            }
        }
    }
    printf("{ ");
    for (int i = 0; i < e; i++) {
        printf("%d, ", array[i]);
    }
    printf("}\n");
    return 0;
}

【讨论】:

  • @Jean-FrançoisFabre:我想我会使用n 而不是e
  • 我修复了 for 循环,但是程序的输出搞砸了。如果数组是 { 5, 4, 3, 2, 1} 它输出 4, 2, 3, 4。为什么?
  • @chqrlie 现在去争取你的 10 次代表 :)
  • @AshleyMoe 你的循环搞砸了。使用 i 和 j 并上升到 n。从 i+1 开始内部循环并 使用 两个索引而不是愚蠢的 +1
  • @AshleyMoe:你肯定打错了修复或输出循环,我得到了正确的结果。
【解决方案2】:

除了 chqrlie 指出的错误之外,不要使冒泡排序过于复杂(它有问题,它只考虑连续索引)。简单地写下来(注意内部循环被优化以避免处理“下三角形”项目两次):

for (int i = 0; i < e; i++) {
    for (int j = i+1; j < e; j++) {
        if (array[j] > array[i]) {
            int swap = array[j];
            array[j] = array[i];
            array[i] = swap;
        }
    }
}

【讨论】:

  • @Jean-FrançoisFabre:你也应该得到你的,但是上面的代码实现了一个稍微不同的排序算法:选择和冒泡排序的混合。冒泡排序只交换相邻元素。 Ashley 的版本将元素冒泡到数组的末尾,她也不处理下三角形,只是处理不同的三角形。见en.wikipedia.org/wiki/Bubble_sort
  • @chqrlie 很高兴知道(现在我明白为什么 OP 代码如此复杂了)。我知道我永远不会重新发明比研究人员所做或将要做的更好的排序,所以我尽量保持简单:冒泡排序或调用某个库 :)
  • @Jean-FrançoisFabre:重新实现和调整排序算法是一种非常有趣和令人谦卑的体验。早餐试试qsort 或 radixsort ;-)
猜你喜欢
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-26
  • 2015-01-14
  • 1970-01-01
  • 2019-09-22
  • 2012-08-26
  • 1970-01-01
相关资源
最近更新 更多