荷兰国旗问题

#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++。

猜你喜欢

转载自blog.csdn.net/u014228447/article/details/80636189