第一次见到这个问题的时候,脑子里面第一反应居然是荷兰豆。。。
好了,言归正传,荷兰国旗就是比较分明的三条颜色,映射到程序员身上就是给定一个数组,以及一个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++;
-
}
-
}
-
}
阅读(1697) | 评论(0) | 转发(0) |