// use k scan array, and keep 2 more pointers i and j // element in [0,i] < key // element in (i,j] == key // element in (j,k] > key public static void partition3Way(int[] A, int key) { int i = -1; int j = -1; for (int k = 0; k < A.length; k++) { if (A[k] > key) continue; else if (A[k] == key) ArrayUtil.swap(A, k, ++j); else { if (j == i) j = i + 1; // no elements equals to key ArrayUtil.swap(A, k, ++i); if (A[k] == key) ArrayUtil.swap(A, k, ++j); // swap back if prev swap put equal element to k } } }
public static int partitionArray(int[] nums, int k) { // write your code here int i = -1; for (int j = 0; j < nums.length; j++) { if (nums[j] < k) ArrayUtil.swap(nums, ++i, j); } return i + 1; }