好了,言归正传,荷兰国旗就是比较分明的三条颜色,映射到程序员身上就是给定一个数组,以及一个target目标,让你给这个数组排个序,要求分成三段,第一段都小于target,第二段都等于target,第三段都大于target。
第二反应这东西就是快速排序的第一部分,只不过中间有序,这样的话,由于是分了三段,就需要两个指针i, j来记录,在实际遍历数组的时候,是需要另外的一个表示当前遍历结尾的k变量,i,j,和k将整个数组分成四个部分[0,i)已经排序,小于target部分,[i,j)已经排序,等于target部分,[j,k],未排序部分,(k,~)已经排序,大于target部分。这样的话,遍历的起始和终止条件就出现了,i,j起始都为0,k=n-1,终止条件就是j>k,所以代码如下:
点击(此处)折叠或打开
- void flag_of_netherland(int *arr, int n, int target){
- int i=0,j=0, k=n-1;
- int temp;
- while(j<=k){
- if(arr[j]<target){
- temp=arr[i];
- arr[i]=arr[j];
- arr[j]=temp;
- i++,j++;
- }else if(arr[j]>target){
- temp=arr[k];
- arr[k]=arr[j];
- arr[j]=temp;
- k--;// 这会不能j++,因为你不知道换过来的是个啥东西
- }else{
- j++;
- }
- }
- }