这道题我是用快速排序来做的,将原数组分为三部分来思考问题
我一直参考的一份答案,发现他的思路其实和我是一样的:https://www.cnblogs.com/kangjianwei101/p/5609105.html
即当等于2的时候不动,继续扫描,大于2的时候就进行一个交换
#include<stdio.h>
//荷兰??国旗问题
//别理解错了,他是有很多个红白蓝小条,而不是只有三个
//这个可以用三路快排来做
#define RED 1
#define WHITE 2
#define BLUE 3
void swap(int *m ,int *n)
{
int p;
p = *m;
*m = *n;
*n = p;
}
void __nationflag(int arr[], int l, int r)
{
int lt = l; //等于2的部分第一个元素的位置
int gt = r; //大于2的部分的前一个元素的位置
int i = l;
while(i <= gt)
{
if(arr[i] < 2) //小于2的 就与 等于2的部分的第一个元素交换
{
swap(&arr[i],&arr[lt]);
i++; //继续扫描下一个元素
lt++; //然后等于2的部分坐标要加一
}
else if(arr[i] > 2)
{
swap(&arr[i],&arr[gt]); //大于2的 就与 gt所指的元素交换
gt --; //gt指针向前移动一步,此时i并不移动,因为并不知道交换过去的是否小于2
}
else
{
i++;
}
}
}
void nationflag(int arr[],int n)
{
__nationflag(arr,0,n-1);
}
void printArray(int a[],int n)
{
int i;
for(i = 0;i < n ; i++)
{
printf("%d ",a[i]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
int arr[12] = {2,3,1,3,2,3,1,1,1,3,2,2};
nationflag(arr,12);
printArray(arr,12);
return 0;
}