有人可以解释这段代码中的最后一个方法吗?

时间:2015-04-25 16:16:21

标签: java bubble-sort

我是初学程序员,我不理解此代码中的最后一个方法(mysort)。它实际上是冒泡排序的一个例子。

import java.util.*;
public class Sort
{
public static void main(String[] args)
{
    int[] a = {22, 55, 44, 11, 33};
    disp(a);
    mysort(a);
    disp(a);
}
public static void disp(int[] x)
{
    for(int e : x)
    {
        System.out.print(e + "\t");
    }
    System.out.println();
}

public static void mysort(int[] a)
{
    int l = a.length;
    for(int i = 0; i < l - 1; i++)
    {
        for(int j = 0; j < l - 1 - i; j++)
        {
            if(a[j + 1] < a[j])
            {
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
}
}

3 个答案:

答案 0 :(得分:2)

这是对上述代码的解释:

让我们取数字数组&#34; 5 1 4 2 8&#34;,并使用冒泡排序将数组从最小数字排序到最大数字。在每个步骤中,比较以粗体书写的元素。将需要三次通行证。

第一关: (5 1 4 2 8)到(1 5 4 2 8),这里,算法比较前两个元素,并且从5开始算起交换。 1。

(1 5 4 2 8)至(1 4 5 2 8),从5开始的交换> 4

(1 4 5 2 8)至(1 4 2 5 8),从5开始的交换> 2

(1 4 2 5 8)到(1 4 2 5 8),现在,由于这些元素已经按顺序排列(8> 5),算法不会交换它们。

第二次通过: (1 4 2 5 8)至(1 4 2 5 8)

(1 4 2 5 8)至(1 2 4 5 8),从4开始的交换> 2

(1 2 4 5 8)至(1 2 4 5 8)

(1 2 4 5 8)至(1 2 4 5 8)

现在,数组已经排序,但算法不知道它是否已完成。该算法需要一个完整的传递,没有任何交换,知道它已被排序。

第三遍: (1 2 4 5 8)至(1 2 4 5 8)

(1 2 4 5 8)至(1 2 4 5 8)

(1 2 4 5 8)至(1 2 4 5 8)

(1 2 4 5 8)至(1 2 4 5 8)

点击此链接获取更多说明:http://en.wikipedia.org/wiki/Bubble_sort

答案 1 :(得分:1)

让我们分解每个方法。要理解的代码的第一部分是最内部的块:

int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;

如果我们使用{1,2,3,4,5}在数组j=2上运行上述语句,我们会:

int temp = a[2] --> 3;
a[2] = a[2+1] --> a = {1,2,4,4,5};
a[2+1] = temp --> a = {1,2,4,3,5};

我们现在看到这三行交换了a[j]a[j+1]的元素。

现在我们来看看for循环。内循环:for(int j = 0; j < l - 1 - i; j++)从数组的开头循环到l-1-i。在每个索引处,它询问if(a[j+1] < a[j]),意思是#34;索引j+1中的元素小于索引j&#34;处的元素,或者更具体地说,&#34; ; j+1j处的元素是否应该交换?&#34;

外部循环只是在索引变量i的整个数组上运行。将两个循环放在一起,我们看到j将首先遍历整个数组而没有最后一个索引,然后整个数组没有最后两个索引,然后没​​有最后三个,等等。例如,如果l = 10 1}},j将采用值:

0 1 2 3 4 5 6 7 8 //i = 0, l - 1 - i = 9
0 1 2 3 4 5 6 7   //i = 1, l - 1 - i = 8
0 1 2 3 4 5 6     //i = 2, l - 1 - i = 7
...
0

因此,两个for循环一起运行在数组的l次的一部分上,进行交换。

以这种方式形成循环的原因是在j=0...l-1-i的每次迭代之后,已知最后一个元素位于其排序位置,因此我们不必再次检查它。这方面的理由和更多:http://en.wikipedia.org/wiki/Bubble_sort

答案 2 :(得分:1)

对于数组mysort中的每个元素,

for(int j = 0; j < l - 1 - i; j++)遍历给定数组for(int i = 0; i < l - 1; i++)

if(a[j + 1] < a[j])
    {
        int temp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = temp;
    }

上面只是交换了两个整数,所以较大的整数排在第二位。

开始:1753年 通过1: 17 53(无交换)
通过1:1 57 3(交换)
通过1:15 37 (无交换)
通过2: 15 37(无交换)
通过2:1 35 7(交换)
通过2:13 57 (无交换)
通过3: 13 57(无交换)
通过3:1 35 7(无交换)
通过3:13 57 (无交换)
完成:1357