2014-09-24 85 views
2

我知道嵌套的循环背后的理由,但是这一次只是让我感到困惑的是要揭示了原因:感到困惑与嵌套循环

public static LinkedList LinkedSort(LinkedList list) 
{ 
    for(int k = 1; k < list.size(); k++) 
    for(int i = 0; i < list.size() - k; i++) 
    { 
     if(((Birth)list.get(i)).compareTo(((Birth)list.get(i + 1)))>0) 
     { 
      Birth birth = (Birth)list.get(i); 
      list.set(i, (Birth)list.get(i + 1)); 
      list.set(i + 1, birth); 
    } 
} 
return list; 
} 

为什么,如果我是更大然后我+ 1,然后交换我和我+ 1?我知道这个编码,i + 1等于k,但是从我的观点来看,我不可能比k更大,对吗?运行结果会是什么样子?我很困惑这个编码想告诉我什么,希望你们能帮我澄清我的疑惑,谢谢。

+0

泛型会让你的生活更轻松。 – jpmc26 2015-01-31 07:28:59

回答

2

此方法实现气泡排序。它按升序重新排列列表中的元素。这个代码中没有显示要排序的确切数据,实际的比较是在Birth#compare中完成的。

让我们先看看内部循环。它进行实际的分类。内循环在列表上迭代,并将位置0处的元素与位置1处的元素进行比较,然后将位置1处的元素与位置2处的元素等进行比较。每次,如果下方元素大于较高元素,他们交换。

内循环的第一次完整运行后,列表中的最大值现在位于列表的末尾,因为它始终大于它所比较的​​值,并且总是被交换。 (尝试用纸上的一些数字来看看会发生什么)

现在内循环必须再次运行。它可以忽略最后一个元素,因为我们已经知道它包含了最大的值。第二次运行后,第二大价值位于倒数第二的位置。

这必须重复,直到整个列表排序。

这是外循环正在做的事情。它运行内部循环的确切次数以确保列表已排序。它还为内部循环提供最后一个必须比较的位置,以忽略已经排序的零件。这仅仅是一个优化,内循环可忽略K类似于这样:

for(int i = 0; i < list.size() - 1; i++) 

这会产生相同的结果,但会在结尾部分需要更长的时间,因为内循环将不必要的比较已经排序值每次列出。

+0

感谢您的详细解释,我明白了。 – 2014-09-24 08:14:14

2

例子:你有要递增排序号码清单:

4 2 3 1

第一次迭代做这些交换操作:swap(4, 2)swap(4, 3)swap(4, 1)。第一次迭代后的中间结果是2 3 1 4。换句话说,我们能够确定哪个数字是最大的,我们不需要迭代中间结果的最后一项。

在第二次迭代中,我们用操作确定第二大数字:swap(3, 1)。中间结果看起来是2 1 3 4

第三次迭代结束时,我们有一个排序列表。

+0

重要解释,谢谢。 – 2014-09-24 08:13:43