我有两个冒泡排序的实现,但其中一个工作正常,另一个不能解释我这两个有什么区别
第一个这很好用
private static int[] sortBuble(int[] a) {
boolean swapped = true;
for (int i = 0; i < a.length && swapped; i++) {
swapped = false;
System.out.println("number of iteration" + i);
for (int j = 1; j < a.length; j++) {
if (a[j - 1] > a[j]) {
int temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
swapped = true;
}
}
}
return a;
}
第二个这不起作用,但看起来或多或少相同
private static int[] sortBuble1(int[] a) {
boolean swapped = true;
for (int i = 0; i < a.length && swapped; i++) {
swapped = false;
System.out.println("number of iteration" + i);
for (int j = i + 1; j < a.length; j++) {
if (a[i] > a[j]) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
swapped = true;
}
}
}
return a;
}
答案 0 :(得分:3)
他们不一样。在第二个示例中,对于inner-for循环的每次迭代,我都保持不变,并使用a[i]
进行比较,这是不正确的。正如我在其他答案中所说,第一个也是效率低下的。以下是第一个的优化版本:
private static int[] bubblesort(int[] nums)
{
boolean done = false;
for (int i = 0; i < nums.length && !done; i++)
{
done = true;
for (int j = nums.length-1; j > i; j--)
{
if (nums[j] < nums[j-1])
{
int temp = nums[j];
nums[j] = nums[j-1];
nums[j-1] = temp;
done = false;
}
}
}
return nums;
}
在i th 迭代结束时,我们知道第一个i元素已经排序,因此我们不再需要查看它们了。我们需要布尔值来确定是否需要继续。如果没有互换,那么我们就完成了。我们可以删除布尔值,它仍然可以工作,但效率会降低。
答案 1 :(得分:1)
不同之处在于用于数组的索引。
在第一种情况下,for
的内部j
循环与i
无关。此外,您在交换时使用j
的相邻值,以便始终在数组中交换相邻值。
在第二种情况下,您的内部for
循环从j
开始i + 1
。并且您使用i
和j
来索引数组。所以你实际上并没有比较相邻的元素,而是相距很远的元素(例如,当i=1
和j=4
时)。这不是冒泡排序,这种算法不会那样工作。