C语言冒泡排序函数for循环失效原因求助
冒泡排序函数失效原因解析
问题背景
在不支持for循环参数内声明变量的C版本中,将循环变量i、j在外部声明并初始化后,冒泡排序函数完全无法正确排序;改为外部声明、在for循环参数内初始化后,函数恢复正常。以下是两种版本的代码:
非工作版本
void bubbleDesc (int n, int array[]) { int i = 0, j = 0, temp; for (i; i < n - 1; i++) { for (j; j < n - 1; j++) { if (array[j] < array[j + 1]) { temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } } }
工作版本
void bubbleDesc (int n, int array[]) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1; j++) { if (array[j] < array[j + 1]) { temp = array[j + 1]; array[j + 1] = array[j]; array[j] = temp; } } } }
失效原因分析
非工作版本的核心问题在于循环变量j没有在每次外层循环迭代时重置为0:
- 第一次外层循环执行时,
j初始值为0,内层循环正常遍历数组完成一轮冒泡交换,结束后j的值会变为n-1(此时j < n-1条件不成立,退出内层循环)。 - 进入第二次外层循环时,内层循环的第一个表达式是
j,这是无意义的空操作,不会重置j的值。此时j仍为n-1,直接不满足j < n-1的条件,内层循环完全跳过。 - 后续所有外层循环迭代中,
j的值始终保持n-1,内层循环都不会执行,数组只被处理了一轮,无法完成完整的冒泡排序,最终导致函数失效。
工作版本中,每次外层循环迭代时,内层循环的for (j = 0; j < n - 1; j++)都会将j重置为0,确保每一轮外层循环都能让内层循环从头遍历数组,完成正确的冒泡交换过程。
内容的提问来源于stack exchange,提问作者Dimitris
相关产品推荐
相关产品推荐

