演算法之(一)荷蘭國旗問題
阿新 • • 發佈:2018-12-18
通過一次劃分,將陣列分為三部分,前半段為小於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–交換後會把最後一次有序的序列錯開