与嵌套循环混淆

时间:2014-09-24 03:47:39

标签: java nested-loops

我知道嵌套循环背后的基本原理,但是这个让我对它想揭示的原因感到困惑:

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;
}

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

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:2)

此方法实现冒泡排序。它按升序重新排序列表中的元素。在此代码中未显示要排序的确切数据,实际比较在Birth#compare。

中完成

让我们先看看内循环。它进行实际排序。内循环遍历列表,并将位置0处的元素与位置1处的元素进行比较,然后将位置1处的元素与位置2处的元素进行比较等。每次,如果较低元素大于较高元素,他们被交换了。

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

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

必须重复此操作,直到整个列表被排序。

这就是外循环正在做的事情。它运行内部循环达到确切的次数,以确保列表已排序。它还为内循环提供了它必须比较的最后位置,以忽略已经排序的部分。这只是一个优化,内部循环可以像这样忽略k:

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

这会得到相同的结果,但需要更长的时间,因为内部循环每次都会不必要地比较列表末尾已经排序的值。