Algorithm 荷兰国旗问题(但使用两种颜色)
如果在一个数组中只有两种颜色需要排序:红色(在左边)和白色(在右边),那么下面的伪代码有逻辑意义吗 伪代码: 指针p&q,其中p指向第一个元素,q指向最后一个元素。p只能在数组中向右移动,q只能在数组中向左移动Algorithm 荷兰国旗问题(但使用两种颜色),algorithm,sorting,Algorithm,Sorting,如果在一个数组中只有两种颜色需要排序:红色(在左边)和白色(在右边),那么下面的伪代码有逻辑意义吗 伪代码: 指针p&q,其中p指向第一个元素,q指向最后一个元素。p只能在数组中向右移动,q只能在数组中向左移动 while(p!=q){ 如果(p->颜色!=红色){ 交换[p,q]; q--; }否则{ p++; } } 是的,算法是正确的 交换只能在q处产生黄色值,并且只要不发生交换,q不会递减。因此,出现在q右侧的所有值必须为黄色 类似地,我们可以推断,如果没有发生交换,这意味着p处的值是红
while(p!=q){
如果(p->颜色!=红色){
交换[p,q];
q--;
}否则{
p++;
}
}
是的,算法是正确的
交换只能在q
处产生黄色值,并且只要不发生交换,q
不会递减。因此,出现在q
右侧的所有值必须为黄色
类似地,我们可以推断,如果没有发生交换,这意味着p
处的值是红色的,只有在这种情况下,p
才会增加。因此,出现在p
左侧的所有值都保证为红色
这是循环不变量:p
左侧的所有值均为红色,q
右侧的所有值均为黄色
当循环退出时,除了循环不变量外,我们还知道
p==q
。有两种可能:该位置的值为红色或黄色。在这两种情况下,排序都是正确的。是,算法是正确的
交换只能在q
处产生黄色值,并且只要不发生交换,q
不会递减。因此,出现在q
右侧的所有值必须为黄色
类似地,我们可以推断,如果没有发生交换,这意味着p
处的值是红色的,只有在这种情况下,p
才会增加。因此,出现在p
左侧的所有值都保证为红色
这是循环不变量:p
左侧的所有值均为红色,q
右侧的所有值均为黄色
当循环退出时,除了循环不变量外,我们还知道
p==q
。有两种可能:该位置的值为红色或黄色。无论哪种情况,排序都是正确的。需要更多的上下文。完整的问题似乎很简单:它使用了一个数组。您的伪代码有点不清楚。p
和q
是否将索引[和/或指针]放入数组?指针p&q,其中p指向第一个元素,q指向最后一个元素。p只能在数组中向右移动,q只能在数组中向左移动。(编辑原文)这篇文章对你有帮助吗?在共享帖子中,数组包含数字0
和1
,而不是颜色Red
和White
。需要更多的上下文。完整的问题似乎很简单:它使用了一个数组。您的伪代码有点不清楚。p
和q
是否将索引[和/或指针]放入数组?指针p&q,其中p指向第一个元素,q指向最后一个元素。p只能在数组中向右移动,q只能在数组中向左移动。(编辑原文)这篇文章对你有帮助吗?在共享帖子中,数组包含数字0
和1
,而不是颜色Red
和White
。