我无法让它工作,我正在尝试使用 for 循环按升序排列数组的值。
int[] arr = new int[5] { 5, 6, 2, 4, 1 };
for (int i = 0; i <= arr.Length; i++)
{
if (arr[i] > arr[i + 1])
{
int temp = arr[i + 1];
arr[i] = arr[i + 1];
arr[i] = temp;
}
Console.Write(arr[i]);
}
最佳答案
我假设您没有使用 Array.Sort
,因为您这样做是为了学习练习;没有其他方法可以避免这种非常常见的库函数。
您的算法不起作用的原因是遍历数组一次并交换乱序的项目是不够的。尝试将此作为一个心理实验,当数组几乎已排序时,但第一个元素在末尾,如下所示:
2 3 4 5 6 7 1
单条路径会让你更接近,但它不会把你带到排序数组:
2 3 4 5 6 1 7
如您所见,您必须多次重复此过程,直到数组排序完毕。你怎么知道数组已经排序了?你知道当整个内部循环没有一次交换时。
这里是你如何实现这个:
bool didSwap;
do {
didSwap = false;
for (int i = 0; i < arr.Length-1; i++)
{
if (arr[i] > arr[i + 1])
{
int temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
didSwap = true;
}
}
} while (didSwap);
for (int i = 0; i != arr.Length ; i++) {
Console.Write(arr[i]);
}
请注意您的代码的几处更改:
- 排序完成后,打印在单独的循环中完成
- 循环转到
arr.length-1
,而不是arr.length
,否则最后一次检查将超出数组的范围。 - 这个排序算法叫做Bubble Sort .对该算法进行了各种优化,使其运行速度稍快。
- 一般来说,冒泡排序属于较慢的排序算法。当要排序的项目数量很多时,您应该考虑高级算法,或使用库实现。
关于c# - 按升序排列数组的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23585431/