You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Code::Blocks中main.exe停止运行,冒泡排序代码报错求助

解决你的冒泡排序崩溃问题

嘿,我来帮你排查这个导致程序崩溃的问题!首先,你的程序在Code::Blocks里出现main.exe停止工作的直接原因是数组越界访问,咱们一步步拆解:

崩溃的核心原因

看你代码里的这行:

else swap(arr[j],arr[j-i]);

当外层循环的i大于0的时候(比如i=1),如果内层循环的j小于i(比如j=0),j-i就会变成负数(0-1=-1),这时候你访问arr[j-i]就是在访问数组的负索引位置——这是内存里不属于你数组的区域,直接触发内存错误,导致程序崩溃。

你的逻辑误区

另外,你提到“每次需要将数组的第一个元素存入'temp'”,但这个思路和冒泡排序的核心逻辑不符。冒泡排序的本质是相邻元素两两比较,把较大(或较小)的元素逐步“冒”到数组的末尾,而不是拿第一个元素去和后续元素比较后交换到前面的位置。

修正后的冒泡排序代码

我帮你重新写了正确的冒泡排序代码,同时保留你想要的“用temp暂存元素”的逻辑(其实冒泡排序也可以直接用swap,但按你的需求调整):

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 补全7个元素避免默认0干扰,若只需排序6个元素,可改为int arr[6] = {7,8,5,2,4,6};
    int arr[7] = {7, 8, 5, 2, 4, 6, 1};
    int temp;
    int n = sizeof(arr)/sizeof(arr[0]); // 动态获取数组长度,更灵活

    // 外层循环:控制排序轮数,每轮将一个最大元素移到末尾
    for(int i = 0; i < n-1; i++) {
        // 内层循环:遍历未排序区域,相邻元素比较交换
        for(int j = 0; j < n-1-i; j++) {
            // 这里是降序排序,若要升序可改为arr[j] > arr[j+1]
            if(arr[j] < arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                // 也可以直接用swap(arr[j], arr[j+1]); 效果一致
            }
        }
    }

    // 输出排序结果
    for(int k = 0; k < n; k++) {
        cout << arr[k] << endl;
    }
    return 0;
}

关键修正点说明

  • 解决数组越界:去掉错误的arr[j-i]访问,改成冒泡排序标准的相邻元素arr[j]和arr[j+1]交换
  • 动态获取数组长度:用sizeof(arr)/sizeof(arr[0])代替硬编码的7,避免数组长度变化时出错
  • 修正循环条件:外层循环只需n-1轮(最后一个元素会自动归位),内层循环上限设为n-1-i,因为每轮已有i个元素在末尾排好序
  • 补全数组元素:避免默认初始化的0干扰排序结果(若只需排序6个元素,直接调整数组定义即可)

内容的提问来源于stack exchange,提问作者era s'q

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:33:13