[英]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.