荷兰国旗划分


/**
* 荷兰国旗划分
* <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];
}

}

/* 如有错误,欢迎批评指正 */
原文地址:https://www.cnblogs.com/laydown/p/12813644.html