冒泡排序逻辑错误

时间:2011-10-20 18:58:40

标签: c#

我正在尝试进行基本的排序练习,我希望能得到一些可能是基本逻辑错误的帮助。

int[] numbers = new int[] { 2, 5, 11, 38, 24, 6, 9, 0, 83, 7 };
        for (int loop = 0; loop < numbers.Length; loop++)
        {
            Console.WriteLine(numbers[loop]);
        }
        Console.WriteLine("Performing a bubble sort");

        bool flag = false;
        do
        {

            for (int loop = 0; loop < numbers.Length - 1; loop++)
            {
                if (numbers[loop] > numbers[loop + 1])
                {

                    int temporary = numbers[loop];
                    numbers[loop] = numbers[loop + 1];
                    numbers[loop + 1] = temporary;
                    flag = true;
                }

            }
        } while (flag == false);

        for (int loop = 0; loop < numbers.Length; loop++)
        {
            Console.WriteLine(numbers[loop]);
        }

6 个答案:

答案 0 :(得分:2)

我不知道一切都是错的,但有一点可以肯定的是,你的do / while循环应该在while(flag == true)而不是while(flag == false)时进行。当然,这可以更简单地写成while(flag)

答案 1 :(得分:1)

你的旗帜逻辑错了。其他一切看起来都很正确。

该标志应该是:

loop until we looped without making any swaps

但这不是您的代码目前所做的。

答案 2 :(得分:1)

您的代码存在两个问题。第一,正如已经指出的那样,你需要循环flag == true。如果你给它一个更具表现力的名字,那就更清楚了。 madeASwap或类似的内容使其显而易见:do while(madeASwap)

另一个问题是在运行内部循环之前需要重置标志。如果没有这个,只需检查false在一次迭代后结束,并检查true会导致无限循环。

简而言之:重置你的旗帜,并在它是真的时循环。

答案 3 :(得分:0)

看一看并迁移:

// array of integers to hold values
private int[] a = new int[100];

// number of elements in array
private int x;

// Bubble Sort Algorithm
public void sortArray()
{
  int i;
  int j;
  int temp;

  for( i = (x - 1); i >= 0; i-- )
  {
    for( j = 1; j <= i; j++ )
    {
      if( a[j-1] > a[j] )
      {
        temp = a[j-1];
        a[j-1] = a[j];
        a[j] = temp;
      }
    }
  }
}

答案 4 :(得分:0)

您的循环条件while(flag == false)应为while(flag == true)

答案 5 :(得分:0)

冒泡排序不是一次排序。在一次迭代中,最大数字移动到最右边的单元格。因此,在第一次迭代之后,最大的数字将存储在最后一个单元格中。

for (int l = numbers.Length - 1; l > -1; l--)  
  for (int loop = 0; loop < l; loop++) { /* your code */ }

你不需要flag(好吧,也许你需要,但那不是你犯的错误)

以下是每次迭代后算法的输出:

2 5 11 24 6 9 0 38 7 83
2 5 11 6 9 0 24 7 38 83
2 5 6 9 0 11 7 24 38 83
2 5 6 0 9 7 11 24 38 83
2 5 0 6 7 9 11 24 38 83
2 0 5 6 7 9 11 24 38 83
0 2 5 6 7 9 11 24 38 83
0 2 5 6 7 9 11 24 38 83
0 2 5 6 7 9 11 24 38 83
0 2 5 6 7 9 11 24 38 83