繁体   English   中英

荷兰国旗问题(但要用两种颜色)

[英]Dutch Flag Problem (But do it with Two Colors)

如果只有两个 colors 需要在一个数组中排序:红色(左侧)和白色(右侧),那么以下伪代码是否具有逻辑意义?

伪代码:

指针p & q ,其中p指向第一个元素, q指向最后一个元素。 p只能向右移动, q只能在数组中向左移动。

while (p != q) {
   if (p->color != Red) {
     swap[p,q];
     q--;
   } else {
     p++;
   }
}

是的,该算法是正确的。

交换只能在q处产生黄色值,并且只要没有交换发生, q就不会递减。 因此,出现在q右侧的所有值都必须是黄色的。

类似地,我们可以推断,如果没有发生交换,这意味着p的值是红色的,只有在这种情况下p才会增加。 因此,所有出现在p左侧的值都保证是红色的。

这是循环不变量: p左边的所有值都是红色的, q右边的所有值都是黄色的。

当循环退出时,除了循环不变量之外,我们还知道p == q 有两种可能:position 处的值要么是红色,要么是黄色。 无论哪种情况,排序都是正确的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM