package Test01;/* * (荷兰国旗问题) * 给定一个数组arr,和一个数num,请把小于num的数放在数组的 左边,等于num的数放在数组的中间,大于num的数放在数组的 右边。 * 要求额外空间复杂度O(1),时间复杂度O(N) */public class NtherlandsFlag { public static void main(String[] args) { int[] arr = { 1, 3, 2, 9, 8, 7, 1, 0, 7, 3, 3, 4, 5, 3 }; // 要排序的数组 int[] test = partition(arr, 0, arr.length - 1, 7); // L,左边界,R,右边界,P,给定的num大小 for (int i = 0; i < arr.length; i++) { // 打印 System.out.print(arr[i] + " "); } System.out.println("\n" + test[0] + " " + test[1]); //打印等于num的开始和结束下标 } public static int[] partition(int arr[], int L, int R, int num) { int less = L - 1; int more = R + 1; while (L < more) { if (arr[L] < num) { //一定要是else if swap(arr, L++, ++less); } else if (arr[L] > num) { swap(arr, L, --more); } else { L++; } } return new int[] { less + 1, more - 1 }; } public static void swap(int[] arr,int a,int b) { //交换 int temp = arr[a]; arr[a] = arr[b]; arr[b] = temp; }}