C#降序排序for循环未遍历至最后元素的问题排查与修复
C# 降序排序异常:
FindBiggestElementIndex 遍历范围不全问题解决 问题核心
你实现的降序排序逻辑依赖查找数组最大元素索引,但因为FindBiggestElementIndex的遍历范围未覆盖到目标区间的最后一个元素,导致第一次排序时漏掉了数组末尾的最大值(34),最终输出6,34,5,4,1而非预期的34,6,5,4,1。
错误代码示例(推测)
大概率是FindBiggestElementIndex的循环条件或SortDescending的调用参数出错,比如:
static int FindBiggestElementIndex(int[] arr, int startIndex, int endIndex) { int maxIndex = startIndex; // 错误:循环条件i < endIndex,导致endIndex对应的元素被跳过 for (int i = startIndex + 1; i < endIndex; i++) { if (arr[i] > arr[maxIndex]) { maxIndex = i; } } return maxIndex; } static void SortDescending(int[] arr) { for (int i = 0; i < arr.Length; i++) { int maxIndex = FindBiggestElementIndex(arr, i, arr.Length - 1); // 交换元素 int temp = arr[i]; arr[i] = arr[maxIndex]; arr[maxIndex] = temp; } }
错误原因
第一次循环时,FindBiggestElementIndex接收的endIndex是4(数组最后一个元素索引),但循环条件i < endIndex只会遍历到索引3,完全漏掉了索引4的34,导致错误地将索引1的6当作最大值交换到首位。
修正方案
1. 修正FindBiggestElementIndex的循环条件
确保遍历范围包含endIndex对应的元素:
static int FindBiggestElementIndex(int[] arr, int startIndex, int endIndex) { int maxIndex = startIndex; // 修正为i <= endIndex,覆盖目标区间所有元素 for (int i = startIndex + 1; i <= endIndex; i++) { if (arr[i] > arr[maxIndex]) { maxIndex = i; } } return maxIndex; }
2. 完整排序逻辑(含测试)
static void SortDescending(int[] arr) { for (int i = 0; i < arr.Length; i++) { // 每次查找从当前i到数组末尾的最大值索引 int maxIndex = FindBiggestElementIndex(arr, i, arr.Length - 1); // C# 7.0+ 元组交换语法,更简洁 (arr[i], arr[maxIndex]) = (arr[maxIndex], arr[i]); } } static void Main() { int[] arr = {6, 34, 5, 4, 1}; SortDescending(arr); Console.WriteLine(string.Join(",", arr)); // 输出:34,6,5,4,1 }
额外注意点
如果你的SortDescending中调用FindBiggestElementIndex时,错误地将endIndex传入为arr.Length - 1 - i,也会导致遍历范围缩小,需确保endIndex始终为arr.Length - 1,保证每次查找未排序区间的全部元素。
内容的提问来源于stack exchange,提问作者Sarah Shaygani
相关产品推荐
相关产品推荐

