使用while循环的冒泡排序。最后一种排序不存在于输出中

时间:2013-11-14 13:19:40

标签: c# sorting

我正在尝试使用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();
        }
    }
}

这种做法是否正确?

5 个答案:

答案 0 :(得分:2)

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

  • 您将vavb设置为零并输入两个while循环
  • 内循环的第一次迭代将i[0]与数组中的每个值进行比较
  • i[vb] < i[va]会在false时返回vb == 0(因为9不小于9)所以不显示任何内容
  • vb递增
  • 内部循环的其余部分完成。由于数组中的每个其他值小于9,它们都输出一个值,但是您输出的值实际上是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循环只打印一些数字,它根本不排序任何东西。

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

答案 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));
}