1. 程式人生 > >演算法之(一)荷蘭國旗問題

演算法之(一)荷蘭國旗問題

通過一次劃分,將陣列分為三部分,前半段為小於num的數,中間半段為等於num的數,後半段為大於num的數

public static void partition(int[] arr, int num) {
		int less = -1;
		int more = arr.length;
		int index = 0;
		//若判斷有等於號,index++, more--交換後會把最後一次有序的序列錯開
		while(index < more) {
			if(arr[index] < num) {
				swap(arr, ++less, index++);
				//System.out.println(Arrays.toString(arr));
			}else if(arr[index] > num) {
				swap(arr, --more, index);
				//System.out.println(Arrays.toString(arr));
			}else {
				index++;
				//System.out.println(Arrays.toString(arr));
			}
		}
	}
	
	public static void swap(int[] arr, int i, int j) {
		int tmp = arr[i];
		arr[i] = arr[j];
		arr[j] = tmp;
	}
	
	public static void main(String[] args) {
		int[] arr = new int[] {7,3,5,1,6,2,7,9};
		partition(arr, 4);
		System.out.println(Arrays.toString(arr));
	}

注意點一
在while迴圈判斷中,若判斷有等於號,index++, more–交換後會把最後一次有序的序列錯開