冒泡排序逻辑错误

本文关键字:错误 冒泡排序 | 更新日期: 2023-09-27 18:11:58

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

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

冒泡排序逻辑错误

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

您的代码有两个问题。首先,正如已经指出的那样,您需要像flag == true一样长的循环。如果你给它起个更有表现力的名字,那就更清楚了。madeASwap或类似的东西很明显:do while(madeASwap) .

另一个问题是,在运行内部循环之前,您需要重置标志。否则,只检查false在一次迭代后就结束了,检查true会导致一个无限循环。

简而言之:重置你的标志,并循环当它为真

你的标志逻辑是错误的。其他一切看起来都是正确的。

标志应该表示:

loop until we looped without making any swaps

看一下这里并迁移:

// 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;
      }
    }
  }
}

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

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

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