好的,所以我正在努力理解这个代码有效的冒泡排序算法,但我不理解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]);
}
}
}
答案 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)
flag
设置为true
(否则无法进入)flag
设为假flag
设置为true
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?
它不会跳出循环,需要break
或return
,因此执行将继续进入for循环。
flag=true;//What does this signify?
当if(bs[i]>bs[(i+1)])
求值为true时设置此值,表示数组尚未排序。