/**
 * 荷兰国旗划分
 * <p>
 * 给定一个数组和一个整数num,请把小于num的数放在数组的左边,把等于num的数放在数组的中间,把大于num的数放在数组的右边(不要求整体有序)
 */
public class NetherlandFlag {
    /**
     * 荷兰国旗划分 以arr[right] 为划分值
     *
     * @param arr   数组
     * @param left  左边界
     * @param right 右边界
     * @return 等于区域的下标范围
     */
    public static int[] netherlandFlag(int[] arr, int left, int right) {
        if (left > right) {
            return new int[]{-1, -1};
        }
        if (left == right) {
            return new int[]{left, right};
        }
        int less = left - 1;
        int more = right;
        int index = left;
        while (index < more) {
            if (arr[index] < arr[right]) {
                swap(arr, index++, ++less);
            } else if (arr[index] > arr[right]) {
                swap(arr, index, --more);
            } else {
                index++;
            }
        }
        swap(arr, more, right);
        return new int[]{less + 1, more};
    }
    /**
     * 交换数组两个元素的位置
     *
     * @param arr 数组
     * @param i   位置
     * @param j   位置
     */
    private static void swap(int[] arr, int i, int j) {
        // 同一个位置交换无意义,并且用异或交换会有问题
        if (i == j) {
            return;
        }
        // 交换
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }
}
/* 如有错误,欢迎批评指正 */