C++中cout执行顺序异常:插入排序后数组未即时打印求助
C++ 插入排序后数组未及时有序输出的问题修复
问题根源
排序函数调用参数错误:
在main的循环中,当前数组实际包含size+1个元素(索引从0到size),但调用insertionSort(array, size)时传入的是size,导致排序函数只会处理前size个元素,刚加入的array[size]完全没被排序。比如第一次循环size=0时,传入size=0,排序函数直接跳过所有逻辑。插入排序函数逻辑破坏:
在insertionSort的while循环里修改了外层for的循环变量i,这会打乱外层循环的递增逻辑,导致元素排序不完整甚至出错。
修复后的代码
#include <stdio.h> #include <iostream> #include <cstdlib> // 补充calloc需要的头文件 using namespace std; void insertionSort(int* array, int size) { // 改用current变量跟踪当前插入位置,不修改外层循环的i for (int i = 1; i < size; i++) { int current = i; int key = current - 1; while (current > 0 && array[key] > array[current]) { int tmp = array[current]; array[current] = array[key]; array[key] = tmp; current -= 1; key -= 1; } } } const int ARRAY_MAXSIZE = 5; int main(void) { int *array = (int*)calloc(ARRAY_MAXSIZE, sizeof(int)); int input; cout << "Enter 5 digits\n"; for (int size=0; size < ARRAY_MAXSIZE; size++) { cout << size << " index "; cin >> input; array[size] = input; // 传入size+1,让排序函数处理全部已加入的元素 insertionSort(array, size + 1); for (int j=0; j <= size; j++) { cout << array[j] << " "; // 加空格方便查看元素 } cout << '\n'; } free(array); // 释放calloc分配的内存,避免泄漏 }
修复说明
- 修正参数传递:调用
insertionSort时传入size+1,确保排序函数处理从0到size的所有元素,刚输入的元素立刻被纳入排序逻辑。 - 隔离循环变量:用
current代替i作为while循环的操作变量,避免破坏外层for循环的计数逻辑,保证每个元素都能被正确处理。 - 补充内存释放:添加
free(array),这是使用C风格内存分配函数后的必要操作,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Jagger Denhof
相关产品推荐
相关产品推荐

