荷兰国旗划分

Posted laydown

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了荷兰国旗划分相关的知识,希望对你有一定的参考价值。


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

}

/* 如有错误,欢迎批评指正 */

以上是关于荷兰国旗划分的主要内容,如果未能解决你的问题,请参考以下文章

荷兰国旗-快速排序应用

荷兰国旗问题

算法荷兰国旗问题

图灵机上的荷兰国旗

荷兰国旗问题

编程之法:面试和算法心得(荷兰国旗)