·
编程学习 ·
11494
何谓荷兰国旗:
现有红、白、蓝三个不同颜色的小球,乱序
排列在一起,请重新排列这些小球,使得红
白蓝三色的同颜色的球在一起。这个问题之
所以叫荷兰国旗,是因为我们可以将红白蓝
三色小球想象成条状物,有序排列后正好组
成荷兰国旗。
问题转换为:给定数组A[0…N-1],元素只能取0、
1、2三个值,设计算法,使得数组排列成
“00…0011…1122…22”的形式。
借鉴快速排序中partition的过程。定义三个指针:
begin=0、current=0、end=N-1:
A[cur]==2,则A[cur] 与A[end]交换,end--,cur不变
A[cur]==1,则cur++,begin不变,end不变
A[cur]==0,则:
若begin==cur,则begin++,cur++
若begin≠cur,则A[cur]与A[begin]交换,begin++,cur不变
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
void Holland(int* a, int length)
{
int begin = 0;
int currentNum = 0;
int end = length - 1;
while (currentNum <= end)
{
if (a[currentNum] == 2)
{
swap(a[end], a[currentNum]);
end--;
}
else if (a[currentNum] == 1)
{
currentNum++;
}
else
{
if (begin == currentNum)
{
begin++;
currentNum++;
}
else
{
swap(a[currentNum], a[begin]);
begin++;
}
}
}
}
int main()
{
int a[] = { 1, 2, 0, 1, 2, 0, 1, 2, 1, 0, 2 };//原数组
int n = sizeof(a) / sizeof(int);//数组长度
for (int i = 0; i<n; i++)
cout << a[i]; //输出原来的数组
cout << endl;
Holland(a, n);
for (int j = 0; j<n; j++)
cout << a[j];
cout << endl;
getchar();
return 0;
}
输出结果:
Python的turtle模块画国旗主要用到两个函数:draw_rentangle和draw_star。 至于函数的调用就和我们学的C,C++是一样的。对于turtle画国旗的程序中,首先是查找国旗的画法,才能用程序实现。自己在实现的过程中主要是对turtle.circle()没有准确掌握,所以花了...
在链表上实现Partition以及荷兰国旗问题 作者:Grey 原文地址: 博客园:在链表上实现Partition以及荷兰国旗问题 CSDN:在链表上实现Partition以及荷兰国旗问题 题目描述 给你一个链表的头节点head和一个特定值x,请你对链表进行分隔,使得所有小于x的节点都出现在大于或等...
第二周课程的ElementraySorts部分练习测验InterviewQuestions的第3题荷兰国旗问题很有意思。题目的原文描述如下: Dutchnationalflag.Givenanarrayofnbuckets,eachcontainingared,white,orbluepebble,...
目录 1问题描述 2解决方案 1问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。 2解决方案 为了方便编码与讨论,用...
荷兰国旗问题 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将...
荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边。要求额外空间复杂度O(1),时间复杂度O(N)。 这个问题的解决思路是这样的,首先划定一个小于区域,其右边界为less,划定一个大于区域,其左边界为more。...
快速排序与荷兰国旗及Partition问题 需求: 1、Partition过程 给定一个数组arr,和一个整数num。请把小于等于num的数放在数组的左边,大于num的数放在数组的右边。 要求额外空间复杂度O(1),时间复杂度O(N) 2、荷兰国旗问题 给定一个数组arr,和一个整数num。请把小于...
这道题目和分成两块的partition的扩展。比如有一堆012数字组成的数组,要分成0000 1111 2222这样的顺序的。 利用lumoto版的partition能够非常好的解决,比hoare好多了。并且直接利用loopinvariant,变成ijk三个指针,[low,i]=...