You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#冒泡排序出现数组索引越界问题:代码报错原因咨询

你的冒泡排序代码问题分析与修正

嘿,我来帮你拆解下这段代码里的问题哈~

1. 索引越界的直接原因

你遇到的索引越界错误,核心是for循环的范围不对:
你的for循环条件是 i < list.Length,这会让i遍历到数组的最后一个索引(也就是list.Length - 1)。这时候i+1就等于list.Length了,而数组的有效索引是从0到list.Length - 1的,访问list[i+1]自然就超出数组范围啦。

2. while循环的逻辑错误

除了索引问题,你的while循环也不符合冒泡排序的逻辑:

  • 你只做了 list[i] = list[i + 1],这相当于直接把前面的元素覆盖成后面的,原来的list[i]的值直接丢失了,根本没完成交换相邻元素的核心操作;
  • 冒泡排序需要多次遍历数组,直到没有元素需要交换为止,而你当前的while循环只会在同一个i的位置无限循环(只要list[i] > list[i+1]成立),根本没法完成整个数组的排序。

修正后的冒泡排序代码

这里给你一个标准的冒泡排序实现,解决上面的问题:

var list = new int[] {5,0,2}; // 待排序数组
bool swapped;

// 只要还有元素交换,就继续遍历数组
do
{
    swapped = false;
    // 内层循环只遍历到倒数第二个元素,避免i+1越界
    for (int i = 0; i < list.Length - 1; i++)
    {
        if (list[i] > list[i+1])
        {
            // 使用临时变量完成相邻元素的交换
            int temp = list[i];
            list[i] = list[i+1];
            list[i+1] = temp;
            swapped = true;
        }
    }
} while (swapped);

Console.WriteLine(string.Join(",", list));

这段代码的关键点:

  • 内层for循环条件改成 i < list.Length - 1,确保i+1永远是有效索引;
  • 用临时变量temp完成元素交换,不会丢失数据;
  • 外层的do-while循环用来判断是否还有元素需要交换,当某次遍历没有交换发生时,说明数组已经有序,结束排序。

内容的提问来源于stack exchange,提问作者Arnye Mob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:01:46