didswaps = 1;
while(didswaps){
didswaps = 0;
for(i=0; i<n-1; i++) {
if(A[i]>A[i+1]) {
int_swap(&A[i], &A[i+1]);
didswaps = 1;
}
}
}
在那里设置didswaps有什么意义?
答案 0 :(得分:0)
它检测到工作尚未完成:一旦某些扫描没有进行任何交换,didswaps == 0
会导致循环终止,从而节省了不必要扫描的时间。
答案 1 :(得分:0)
如果didswaps
仍为0
,则意味着每两个邻居元素都被正确排序,因此它会更快地结束排序算法(之前)
答案 2 :(得分:0)
每次重新交换2个元素时,您都会为didswaps
分配1个。
当您在循环结束时,您已didswaps > 0
进行了修改,且列表未排序。
但如果didswaps == 0
您的列表已排序;)
答案 3 :(得分:0)
BubleSort遍历列表,直到不需要交换,这表明列表已排序。
didswaps
表示交换是否发生(didswaps
= 1)。如果没有发生交换,则列表被排序,因此应该中断while循环(didswaps
= 0)。 didswaps
用作布尔值,它只能采用值0或1。
答案 4 :(得分:0)
通过观察n
- 次传递找到n
个最大元素并将其放入最终位置,可以轻松优化冒泡排序算法。因此,在第n-1
次运行时,内循环可以避免查看最后的n
项。
如果特定传递中没有交换,则表示数组已经排序,因此我们不应该执行更多传递。为此,我们可以有一个标志变量,在每次传递之前设置为true,并在执行交换时变为false。
didswaps
通过排除不必要的传递来完全实现此优化。