我是初学程序员,我不理解此代码中的最后一个方法(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;
}
}
}
}
}
答案 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+1
和j
处的元素是否应该交换?&#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