我正在尝试进行基本的排序练习,我希望能得到一些可能是基本逻辑错误的帮助。
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]);
}
答案 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