我正在尝试使用while创建冒泡排序。我在下面发了我的课。为什么在排序中没有显示9的最后一个int。
namespace BubbleSort {
class Program
{
static void Main(string[] args)
{
int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8};
int va = 0, vb = 0;
//loop through all numbers in the array.
while (va < i.Length)
{
//loop through all numbers in the array trailing the first loop by 1.
while (vb < i.Length)
{
//compare the two values.
if (i[vb] < i[va]) {
Console.WriteLine(vb);
}
vb++; //increment
}
va++; //increment
}
Console.ReadLine();
}
}
}
这种做法是否正确?
答案 0 :(得分:2)
简而言之,没有。你实际上并没有对任何东西进行排序。以下是代码中发生的情况:
va
和vb
设置为零并输入两个while
循环i[0]
与数组中的每个值进行比较i[vb] < i[va]
会在false
时返回vb == 0
(因为9
不小于9
)所以不显示任何内容vb
递增vb
而不是数组中的值。您的循环从0
变为8
并跳过第一个值,因为它在数组中最高 - 因此您在1
中输出数字8
内环。vb
设置为9
va
并重复vb
仍设置为9
,因此完全跳过内部循环va
达到9,此时代码完成。如果您使用其他数组作为输入,则会发现您获得了完全不同的结果。例如,如果从数组前面删除9,则只能获得3
作为输出(因为只有i[3]
小于2
的第一个值)。如果使用三个零值填充数组,则输出中实际得到9,10和11,因为您输出的是计数器/索引值而不是实际的排序值。
答案 1 :(得分:1)
不,不是。
1)违反“S”原则:实现bobble排序的类不应写入控制台。
http://es.wikipedia.org/wiki/SOLID_(object-oriented_design)
2)你的嵌套while循环只打印一些数字,它根本不排序任何东西。
答案 2 :(得分:1)
不,这不是冒泡排序,另外您输出的是数组的索引而不是值。请参阅Wikipedia解释
你想要更像的东西:
int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8};
int va = 0;
bool swapped = true;
while (swapped) {
swapped=false;
va = 0;
//loop through all numbers in the array.
while (va < i.Length -1)
{
//compare the two values.
if (i[va] > i[va+1]) {
int swap = i[va];
i[va] = i[va+1];
i[va+1] = swap;
swapped=true;
}
//increment
va++;
}
}
然后i
将被排序。
顺便说一下这是次优的,你可以使用第n遍优化和for循环来获得更好的算法
带有for循环的更优化版本可以是
int[] i = {9, 2, 7, 6, 1, 3, 5, 4, 8};
int n = i.Length -1;
bool swapped = true;
for (int n = i.Length - 1; swapped && n > 0; n--) {
swapped = false;
for (int va=0; va < n; va++) {
if (i[va] > i[va+1]) {
int swap = i[va];
i[va] = i[va+1];
i[va+1] = swap;
swapped=true;
}
}
}
答案 3 :(得分:0)
这确实不是冒泡。冒泡排序使用多个过程,更改要排序的列表中项目的位置。您只需浏览列表并在每个循环中选择smallets值。
回答你的问题:
i[vb] < i[va]
i [0]为9. 从不小于其他条目的任何,因此永远不会被打印。
修改
“是的,是的。正在打印索引。有趣的是,我没有看到vb在任何时候被重置为0 ?? 好吧,让我说我很困惑为什么有人会认为这是一种排序算法:)答案 4 :(得分:0)
public static void BubbleSort(int[] arr)
{
for (int i = 0 ; i < arr.Length; i++)
{
for (int j = i + 1 ; j< arr.Length; j++)
{
if (arr[i] > arr[j])
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
}
Console.WriteLine(String.Join(", ", arr));
}