冒泡排序逻辑错误
本文关键字:错误 冒泡排序 | 更新日期: 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