我正在尝试制作一个冒泡排序程序,可以从底部对整数数组进行排序。
var list = new int[] {5,0,2}; //array
for (int i = 0; i < list.Length; i++)
{
while (list[i] > list[i+1])
{
list[i] = list[i + 1];
}
}
Console.WriteLine(string.Join(",", list));
我在while (list[i] > list[i+1])
中得到索引超出范围错误。我的代码出了什么问题?我的状况不好吗?
答案 0 :(得分:4)
我的状况不好吗?
不,您的for
循环条件不正确。在这里查看循环,并考虑循环体内i
的值。
for (int i = 0; i < list.Length; i++)
确保list[i]
始终有效。但是您正在使用list[i + 1]
,因此您需要确保i + 1
是数组的有效索引。最简单的方法是减少条件限制:
for (int i = 0; i < list.Length - 1; i++)
这将删除该异常,但您将留下此while
循环:
while (list[i] > list[i+1])
{
list[i] = list[i + 1];
}
您不会在循环中修改i
的值,这意味着只有永远才会执行一次 - 只要您在&#39;我执行了该循环的主体,条件将变为假。因此将它写成if
语句会更清楚:
if (list[i] > list[i+1])
{
list[i] = list[i + 1];
}
现在我怀疑不是你想要的东西 - 你可能想要交换值而不仅仅是分配,而你可能想要一个循环,但那是相当的超出了直接问题的范围。
答案 1 :(得分:0)
感谢所有人的帮助,最后我使用添加bool来保证检查数组是否需要再次重复内循环:
var list = new int[] {5,7,0,2}; //array
bool alert = true;
while (alert == true)
{
alert = false;
for (int i = 0; i < list.Length - 1; i++)
{
while (list[i] > list[i + 1])
{
int temp = list[i];
list[i] = list[i + 1];
list[i + 1] = temp;
alert = true;
}
}
}
Console.WriteLine(string.Join(",", list));
Console.ReadKey();