快速排序的应用——荷兰国旗问题

  1. 题目描述:
    荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。
    题目中可以使用数字和颜色进行对应
red		=	0
white 	=	1
blue	=	2 
  1. 实现方式:快速排序,实现区间划分。可以看下面我的这篇介绍
    快排实现原理
  2. 代码:
#include<bits/stdc++.h>
using namespace std;

vector<int> Patition(int a[], int l, int r,int key)
{
	int less = l-1;
	int more = r+1;
	int pos = l;
	std::vector<int> equals;
	while(pos < more)
	{
		if(a[pos] < key){
			swap(a[++less],a[pos++]);
		}else if(a[pos] > key){
			swap(a[--more],a[pos]); 
		}else{
			pos++;
		}
	}
	equals.push_back(less+1);
	equals.push_back(more-1);
	return equals;
}
void PrintArr(int arr[],int len)
{
	printf("%d", arr[0]);
	for(int i = 1; i < len; ++i)
		printf(" %d", arr[i]);
	printf("\n");
}

int main()
{
	int arr[] = {0,2,1,1,2,0,2,1};
	int len = sizeof(arr)/sizeof(arr[0]);
	PrintArr(arr,len);
	printf("After change is: ");
	vector<int> equals = Patition(arr,0,len-1,1);
	PrintArr(arr,len);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/bryant_xw/article/details/87933123