荷兰国旗问题:

荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红、白、蓝。现有若干由红、白、蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放最左边、所有白色的条块放中间、所有蓝色的条块放最右边。

有一个数组,输入一个数num,把小于这个数的放左边,等于这个数的放在中间,大于这个数的放右边。

假设有一个数组arr{12,3,2,4,2,6,4}。我们输入一个数4。把小于部分的xia'下标用less表示,大于部分的用more表示,整个数组下标用cur表示。当cur下标指向的数组的值小于数num的时候,less有右移一位,然后和cur指向的数交换,cur++;当cur下标指向的数组的值大于数num,more左移一位,然后会cur指向的数jiao交换,cur这是不操作,因为此时more的数不能确定数字的大小。如果上述都不满足cur++;结束的条件是当cur和more相碰;

下面看代码:

package com.Quik;

public class HelangFlage {
	/*
	 * 荷兰国旗问题
	 */
	public static void process(int[]arr,int num){
		if(arr==null && arr.length<2){
			return ;
		}
		process(arr,0,arr.length - 1,num);
	}
	public static void process(int[] arr, int L,int R,int num){
		 int less = L - 1 ; 
		 int more = R  +1; 
		 int cur = L ; 
		 while(cur < more){
			 if(arr[cur]<num){
				 swpe(arr,++less,cur++);
			 }else if(arr[cur]>num){
				 swpe(arr,--more,cur) ;
			 }else{
				 cur++ ;
			 }
		 }
	}
	public static void swpe(int[] arr , int i, int  j ){
		int temp = arr[i] ;
		arr[i] = arr[j] ; 
		arr[j] = temp ;
	}
	public static void main(String[] args) {
		int[] arr = new int []{3,1,2,4,5,10,10,4,65,32,45,123,65} ;
		process(arr,65);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
}

那么快速排序是什么呢?

快速排序就是没有自己输入的num值作为参考。而是以数组arr的最后一个数作为参考。当一个循环结束的时候把这个数和more下标的值交换。排序完成。

下面看代码

package com.Quik;

public class QuiklySot {
	public static void QuikSort(int[] arr){
		if(arr==null && arr.length < 2){
			return  ;
		}
		QuikSort(arr, 0, arr.length - 1);
	}
	
	
	public static void QuikSort(int[] arr,int L,int R){
		if(L<R){
			int[] flage = process(arr, L, R);
			QuikSort(arr, L, flage[0]-1);
			QuikSort(arr, flage[1]+1, R);
		}
		
	}
	public static int[] process(int[] arr ,int L, int R){
		int less = L - 1 ; 
		int more = R ;  //选取数组最后一个数作为参考,循环过程不动
		int cur = L ;
		while(cur<more){
			if(arr[cur]<arr[R]){
				swpe(arr, ++less, cur++);
			}else if(arr[cur]>arr[R]){
				swpe(arr, --more, cur);
			}else{
				cur++;
			}
		}
		swpe(arr, more, R); //arr[R]和arr[more]交换
		return new int[]{less+1,more} ; //返回等于arr[R]的第一个下标less+1和最后一个下标more
	}
	public static void swpe(int[] arr ,int i,int j ){
		int temp = arr [i] ;
		arr[i] = arr[j] ;
		arr[j] = temp ;
	}
	public static void main(String[] args) {
		int[] arr = new int[]{13,34,1234,1,234,2,34,134,456,67,345,23} ;
		QuikSort(arr);
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]+",");
		}
	}
}