0

我正在尝试使用 while 创建一个冒泡排序。我在下面发布了我的课程。为什么在排序中最后一个 int 不显示 9。

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();
        }
    }
}

这种方法正确吗?

4

5 回答 5

2

不,那不是冒泡排序,另外你输出的是数组的索引而不是值。参见维基百科的解释

你想要更多类似的东西:

   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;
      }
   }
}
于 2013-11-14T13:32:34.040 回答
2

简而言之,没有。你实际上并没有对任何东西进行排序。以下是您的代码中发生的情况:

  • 您将vaandvb设置为零并输入您的两个while循环
  • 内部循环的第一次迭代比较i[0]数组中的每个值
  • i[vb] < i[va]返回false何时vb == 0(因为9不小于9)所以什么也不显示
  • vb递增
  • 内循环的其余部分完成。由于数组中的所有其他值小于 9,因此它们都输出一个值,但您输出的值实际上vb不是数组中的值。您的循环从0to 开始8,您跳过第一个值,因为它是数组中的最高值 - 因此您将数字输出18内部循环中。
  • 内循环以vbset to结束9
  • 你的外循环递增va并重复
  • vb仍然设置为9,因此内部循环完全被跳过
  • 重复上述两个步骤,直到va达到 9,此时代码完成。

如果您使用不同的数组作为输入,您会看到得到完全不同的结果。例如,如果从数组的前面删除 9,则只能3作为输出获得(因为仅i[3]小于 的第一个值2)。如果你用三个零值填充你的数组,你实际上会在输出中得到 9、10 和 11,因为你输出的是计数器/索引值而不是实际的排序值。

于 2013-11-14T13:32:54.370 回答
1

不,这不对。

1)违反“S”原则:实现冒泡排序的类不应该写入控制台。

http://es.wikipedia.org/wiki/SOLID_(面向对象设计)

2)您的嵌套 while 循环只打印一些数字,它根本不排序任何东西。

http://en.wikipedia.org/wiki/Bubble_sort

于 2013-11-14T13:31:41.003 回答
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));
}
于 2013-11-14T13:36:24.170 回答
0

这确实不是冒泡排序。冒泡排序使用多次传递,更改要排序的列表中项目的位置。您只需浏览您的列表并在每个循环中挑选出 smallets 值。

要回答您的问题:

i[vb] < i[va]

i[0] 是 9。它永远不会小于您的任何其他条目,因此它永远不会被打印。

编辑

当当,是的。正在打印索引。有趣的是,我没有看到 vb 随时重置为 0?好吧,假设我很困惑为什么有人会认为这是一种排序算法:)

于 2013-11-14T13:32:00.240 回答