C#荷兰国旗算法练习代码添加Console.ReadLine后仍无输出是什么原因
问题排查与修复
你代码存在4个核心问题,直接导致要么数组越界程序崩溃无输出,要么逻辑错误无法得到正确结果:
- 索引越界问题:你初始化
o = a.Length,数组长度为9时合法索引是0~8,后续执行a[o] = ...直接触发索引越界异常,程序未捕获异常直接终止,所以没有输出 - 交换逻辑错误:你当前的交换代码是把
a[i]的值赋值给目标位置后又直接写回a[i],完全没有完成两个位置值的交换,等于做了无用操作 - 循环变量未正确推进:整个循环里没有写
i的自增逻辑,符合条件的场景下i不会向后走,会直接陷入死循环 - 三色分类逻辑缺失:荷兰国旗算法要求三类元素分别归类为「被3整除」「被7整除且不被3整除」「既不被3也不被7整除」,你当前的分支逻辑没有处理被7整除的中间类的场景,也没有对应控制i的推进规则
修正后代码
static void Main(string[] args) { int[] a = { 14, 18, 6, 4, 7, 12, 3, 9, 11 }; int left = 0; // 指向被3整除区域的下一个空位 int right = a.Length - 1; // 指向既不被3也不被7整除区域的前一个空位,修复越界问题 int i = 0; int temp; while (i <= right) { if (a[i] % 3 == 0) { // 交换i和left位置的元素,修复交换逻辑 temp = a[i]; a[i] = a[left]; a[left] = temp; left++; i++; // 换过来的元素已经处理过,i向后走 } else if (a[i] % 7 == 0) { // 属于中间类,直接向后走 i++; } else { // 属于最右类,交换i和right位置的元素 temp = a[i]; a[i] = a[right]; a[right] = temp; right--; // 这里i不增加,因为换过来的元素还没做判断 } } for (int j = 0; j < a.Length; j++) { Console.WriteLine(a[j]); } }
运行后输出顺序为:被3整除的元素在前,被7整除的元素在中间,剩余元素在最后,完全符合荷兰国旗算法的分类要求。
内容的提问来源于stack exchange,提问作者OneGuyFromDownTown
相关产品推荐
相关产品推荐

