#include<iostream>
#include<vector>
using namespace std;
#define N 10
//荷兰国旗问题:现有红、白、蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。
//问题转换,给定数组A[0...N-1],元素只能取0,1,2三个值,设定算法使得所有的0在左边,所有的1在中间,所有的2在右边。
void printArray(int *a,int len)
{
for(int i=0;i<len;i++)
cout<<a[i]<<" ";
cout<<endl;
}
void swap(int &a,int &b)
{
int buf=a;
a = b;
b = buf;
}
void quickSort(int *a,int len)
{
int less=-1;
int more=len;
int p=0;
while(p<more)
{
if(a[p] == 0)
{
swap(a[p],a[less+1]);
less++;
p++;
}
else if(a[p] == 2)
{
swap(a[p],a[more-1]);
more--;
}
else
{
p++;
}
}
}
int main()
{
int a[N]={0,2,1,2,0,0,1,2,2,1};
quickSort(a,N);
printArray(a,N);
return 0;
}
这里借鉴的快速排序中的partition部分,需要注意的是,中==2(>1)的部分不进行p++。
荷兰国旗问题
最新推荐文章于 2024-07-10 20:44:52 发布