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
相关产品推荐
相关产品推荐

