这是我使用boolean改进冒泡排序的代码。
import java.util.Scanner;
class BubbleSort {
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
int[] array = new int[5];
int temp;
boolean swap;
int count = 0;
for(int i = 0 ; i < array.length ; i++) {
System.out.println("Enter a number!");
array[i] = s.nextInt();
}
for(int i = 0 ; i<array.length-1; i++) {
swap = false;
for(int j = i + 1 ; j < array.length ; j++) {
count++;
if(array[i] > array[j]) {
temp = array[i];
array[i] = array[j];
array[j] = temp;
swap = true;
}
}
if(!swap) {
break;
}
}
for(int i = 0 ; i < array.length ; i++) {
System.out.println(array[i]);
}
System.out.println();
System.out.println(count);
}
}
这段代码有时会为我排序,但有时却没有。
我使用count来查找计算机进行了多少比较,所以我知道我使用的是改进的冒泡排序,而不是简单的冒充。
首先,我要求用户输入五个数字进行排序。
如果数字是:5 4 3 2 1
排序后的列表为1 2 3 4 5
,它显示的比较次数为10
或
如果数字是:1 2 3 4 5
排序列表为1 2 3 4 5
,比较为4
(这也是正确的,因为它只有4次比较)。
BUT
如果用户输入:1 3 2 4 5
排序列表为1 3 2 4 5
(未更改),比较次数为4
。
所以它没有交换3和2。
我的代码出了什么问题? 是因为当我比较1和3时,for循环中断了吗?
答案 0 :(得分:1)
我的代码出了什么问题?
问题是swap
变量以及当您将单个元素与以下所有内容进行比较并且从不交换时,您将突破外部循环这一事实。
在您提供的示例中:1,3,2,4,5
外部循环以1运行,因为它是swap
从未设置为true
的最小值,逻辑在到达下一个元素(3)之前就已断开。
固定代码(只需删除&#34;改进&#34;):
Scanner s = new Scanner(System.in);
int[] array = new int[5];
int temp;
int count = 0;
for(int i = 0 ; i < array.length ; i++)
{
System.out.println("Enter a number!");
array[i] = s.nextInt();
}
for(int i = 0 ; i<array.length; i++)
{
for(int j = i + 1 ; j < array.length ; j++)
{
count++;
if(array[i] > array[j])
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
for(int i = 0 ; i < array.length ; i++)
{
System.out.println(array[i]);
}
System.out.println();
System.out.println(count);
注意:正如我在上面的评论中写的那样,这不是冒泡排序,因为冒泡排序会交换两个相邻的元素,如果它们的顺序错误,而这里的比较是在array[i]
和array[j]
不一定相邻。
答案 1 :(得分:0)
内循环上的for循环条件不正确。数组比较和交换逻辑也是错误的。正如评论中所提到的,您的代码没有进行冒泡排序。
<强>提示:强>
对于内循环,j
应该从0开始并且循环与j < array.length - i - 1
一样长。如果array[j]
。
array[j + 1]
和array[j] > array[j + 1]