带有while语句的场景

时间:2014-09-09 01:49:37

标签: java while-loop

好的,所以我正在努力理解这个代码有效的冒泡排序算法,但我不理解while语句?它在括号中没有条件,我不知道为什么它继续运行以及为什么它会停止。

public class BubbleSort {
int temp;
boolean flag;
int[] bubbleSort(int[] bs)
{  
    flag=true;//What? 
    while(flag)//Whats happening here? Whats the condition
    {
    flag=false;//Wouldnt that quit the while loop?
    for(int i=0;i<bs.length-1;i++)
    {   
        if(bs[i]>bs[(i+1)])
        {
            temp=bs[i];
            bs[i]=bs[i+1];
            bs[i+1]=temp;
            flag=true;//What does this signify?
        }

    }
}
    return bs;
}

public static void main(String[] args)
{
    BubbleSort thisone = new BubbleSort();
    int[] bacon = {1,0,3,2,4,5};
    int[] potato = thisone.bubbleSort(bacon);
    for(int i=0;i<potato.length;i++)
    {
        System.out.println(potato[i]);
    }

}

}

4 个答案:

答案 0 :(得分:2)

在伪代码中可能更容易理解,没有所有语言特定的东西:

didSwap = true                          # force loop entry
while didSwap:                          # keep going until sorted
    didSwap = false                     # mark sorted
    for each element except last:
        if element > next element:
            swap element, next element
            didSwap = true              # swapped, mark possibly unsorted

didSwap (a)变量最初设置为true以确保输入循环。

进入循环后,它会立即设置为false,这样就不会将其设置为true,循环将在此迭代后退出。这意味着循环迭代的默认行为是完成,然后退出循环(所有关于迭代的讨论都参考外部循环,while循环,而不是内部{ {1}}一)。

现在看看是什么让它回归真实。这是迭代中任何项目的交换。当发生这种情况时,你知道你需要至少再循环一次循环,因为你可能已经扰乱了你在此次迭代中已经完成的项目的顺序。

考虑以下数字的情况,并且您已经完成了第一次迭代(尚未进行掉期):

for each

从左到右,您已到达5 10 15 7 20 ^^ 并且您知道前三个数字已经按顺序排列。但随后您转到15并将其与7交换以修复这两者的顺序。现在你有:

15

你可以看到,因为你已经对之前的序列进行了更改,你可能会对订单造成干扰(事实上你是在这种情况下,所以你需要至少再传一次来检查和/或修复它。

最重要的是,由于处理列表的顺序性(从左到右),如果到达迭代结束并且在该迭代期间没有执行交换,则只能确定它是否已排序。

那是使用flag方法的原因。对于大小为5 10 7 15 20 ^^ 的列表,更简单的实现只需对n * n次迭代执行类似操作。这也保证了项目将在最后进行排序,但不会为您提供flag方法的早期退出可能性。如果你给它一个已经排序的千元素列表,你可以立即看到问题。

天真的方法将处理整个列表一千次,标记方法只处理一次。


(a)我更喜欢n,因为它的使用和意图更清晰。

答案 1 :(得分:1)

flag是典型的冒泡排序优化。如果您浏览整个数组并且不做任何更改,那么数组将被排序,您可以停止。 while(flag)表示&#34;只要数组仍然需要排序。&#34;

换句话说,标志短路排序。它可以让你尽早停止。

答案 2 :(得分:0)

  1. 在进入循环之前,flag设置为true(否则无法进入)
  2. 一旦进入,就会将flag设为假
  3. 如果符合条件,则flag设置为true
  4. 回到循环的顶部 - flag设置了吗?如果为false,则会中断,否则返回step2

答案 3 :(得分:0)

flag=true;//What?

标志先前被声明为布尔值,现在它被初始化为true(这样循环将至少执行一次)

while(flag)//Whats happening here? Whats the condition

条件只是评估为布尔值的东西,在这种情况下,布尔变量flag 条件。

flag=false;//Wouldnt that quit the while loop?

它不会跳出循环,需要breakreturn,因此执行将继续进入for循环。

flag=true;//What does this signify?

if(bs[i]>bs[(i+1)])求值为true时设置此值,表示数组尚未排序。