- 题目描述:
荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。
题目中可以使用数字和颜色进行对应
red = 0
white = 1
blue = 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;
}