1 | int[] numbers = { 5, 8, 14, 1, 5678 };
2 | int tempVar;
3 | for (int i = 0; i < numbers.length; i++)
4 | {
5 | for(int j = 0; j < numbers.length; j++)
6 | {
7 | if(numbers[i] > numbers[j + 1])
8 | {
9 | tempVar = numbers [j + 1];
10 | numbers [j + 1]= numbers [i];
11 | numbers [i] = tempVar;
12 | }
13 | }
14 | }
15 | for (int i = 0; i < numbers.length; i++)
16 | {
17 | System.out.println(numbers[i].toString());
18 | }
我是Java的新手,我自己学习。 我有一些问题 气泡排序。
我的问题是线路5
到7
. 据我了解,外层 循环从i
开始0
,然后内部循环从j
运行0
每次增加1
,直到j
达到4
,之后外环 将晋级i
是1
. 因此,在外循环前进到i
之前 1
,应该发生以下情况。
当i=0
时,数字i=5
然后内部循环运行:
当j=0
时,数字j=5
j=1
时,编号j=8
j=2
时,编号j=14
j=3
时,数字j=1
当j=4
时,数字j=5678
那么如果数字 i 大于数字 j+1
,则两个数字是 交换。
然后我们将5
与5
进行比较,然后5
与8
进行比较,然后5
与14
进行比较,然后5
用1
,然后用5678
5
,这与气泡排序的方式不同 作品(与8
相比5
,然后与14
8
,然后与1
和14
和 然后1
5678
(。
我不明白5
7
行的代码如何导致 以应有的方式比较两个相邻的数字 气泡排序。 谁能指出我想错了什么?
如有人更详细地指出如何 行5
7
工作。 如果一步一步就更好了 可以提供细目。 谢谢!
从 35.00 左右开始观看,这就是气泡排序。你的理解是正确的。气泡排序比较元素 1、2 - 如果 elem 1> elem 2 然后交换它们 - 然后是 2,3,然后是 3,4,依此类推,直到 n-1 和 n。在第一次传递中,最大的元素是元素 n。因此,在第二遍中,您不需要检查最后一个元素,而只需要检查第 n-1 个元素。
对于每个传递,您使用索引">j",对于所有传递,您使用索引"i"。
因此,在传递期间不使用索引"i"进行交换。
所以在你的第五行和第七行
5 | for(int j = 0; j < numbers.length; j++)
6 | {
7 | if(numbers[i] > numbers[j + 1])
不要使用索引"i"进行比较,而是这样做
7 | if(numbers[j-1] > numbers[j])
从 1 开始 J。
正如我在每次使用索引"j"传递后所说,下次您需要少走一个元素,因为每次传递都会将最大的元素放在该传递的最后一个位置。因此,您无需为传递后的最后一个元素而烦恼。所以你的第五行变成了
5 | for(int j = 1; j < numbers.length-i; j++)
因为每次通过后,"j"最多只能少一个元素。
所以整个循环
for(i=0 to n)
{
for(j=1 to n-i)
{
if(array[j-1]>array[j])
swap(array[j-1],array[j]);
}
}
你需要对内循环和外循环这样做:
for (int i = 0; i < numbers.length-1; i++)
{
for(int j = i+1; j < numbers.length; j++)
{
if(numbers[i] > numbers[j])
{
tempVar = numbers [i];
numbers [i]= numbers [j];
numbers [j] = tempVar;
}
}
}
嗯,气泡排序有多种实现,一种是由 Kiner 提出的。在您的情况下,您只需在第 5 行中逐个拾取索引,即:
5 | for(int j = 0; j < numbers.length; j++)
它迭代整个数组,在第 7 行中,您将数组的第 j 个元素与第 i 个元素进行比较,即:
7 | if(numbers[i] > numbers[j + 1])
当 i=0,数字 i=5 时,内部循环运行,它将 5 与数组的所有元素从 1 到第 n 个索引进行比较。如果第 i 个元素大于数字 [j+1],则它将被与该数字交换以使数字按升序排列。请记住,在每次迭代结束时,必须至少有一个元素根据排序顺序放置在正确的位置。因此,在第一次迭代结束时,数组将如下所示:
numbers = { 1, 8, 14, 5, 5678 };
现在考虑 i=1,数字 i=8,然后再次运行内部循环,它将 8 与从 1 到第 n 个索引的所有元素进行比较。如果第 i 个元素大于数字 [j+1],那么它将被交换为该数字。
另一个重要的提示是第 5 行应该是:
5 | for(int j = 0; j < numbers.length - 1; j++)
因为在第 7 行中您正在访问数字 [j + 1],当 j 的值为 4 时,程序将尝试访问第 7 行 if 语句中的数字 [5],这将导致错误。希望这有帮助。
基本上你正确地描述了第 5 行到 7 行的作用。
then the inner loop runs from j is 0 and increases by 1 each time until j reaches 4
这也是正确的,因为 numbers.length 是 5。
numbers[j + 1]
这是不对的。如果 j 是 4,那么 j+1 是 5,数字 [5] 将抛出一个索引越界异常(或类似的东西(。
你需要这样做:
public static void bubbleSort(int[] numArray) {
int n = numArray.length;
int temp = 0;
for (int i = 0; i < n; i++) {
for (int j = 1; j < (n - i); j++) {
if (numArray[j - 1] > numArray[j]) {
temp = numArray[j - 1];
numArray[j - 1] = numArray[j];
numArray[j] = temp;
}
}
}
}