Java - 数组气泡排序


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的新手,我自己学习。 我有一些问题 气泡排序。

我的问题是线路57. 据我了解,外层 循环从i开始0,然后内部循环从j运行0 每次增加1,直到j达到4,之后外环 将晋级i1. 因此,在外循环前进到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,则两个数字是 交换。

然后我们将55进行比较,然后58进行比较,然后514进行比较,然后51,然后用5678 5,这与气泡排序的方式不同 作品(与8相比5,然后与14 8,然后与114和 然后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;
            }
        }
    }
}

最新更新