给定数组和num做分区


import java.util.Arrays;

/**
* Partition
* 给定一个数组和一个整数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边(不要求整体有序)
* 要求额外空间复杂度O(1),时间负责度O(N)
*/
public class Partition {

public static void main(String[] args) {
// 测试次数
int times = 500000;

int maxNum = 100;
int maxSize = 100;
int num = 50;
for (int i = 0; i < times; i++) {
// 生成随机数组
int[] arr = generateArray(maxNum, maxSize);
int[] arr2 = copyArray(arr);
// 分区
patition(arr, num);
// 比较结果
if (!checkResult(arr, num)) {
System.out.println("the result is error at " + i);
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(arr2));
return;
}
}
System.out.println("the result is right");
}

public static void patition(int[] arr, int num) {
if (arr == null || arr.length < 2) {
return;
}
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] <= num) {
swap(arr, i, ++index);
}
}
}

/**
* 分区对数器
*
* @param arr 数组
* @param num 给定的num
* @return 分区结果是否正确
*/
public static boolean checkResult(int[] arr, int num) {
int index = -1;
for (int i = arr.length - 1; i >= 0; i--) {
if (arr[i] <= num) {
index = i;
break;
}
}
if (index == -1) {
return true;
}
for (int i = 0; i < arr.length; i++) {
if (i <= index && arr[i] > num) {
return false;
}
if (i > index && arr[i] <= num) {
return false;
}
}
return true;
}

/**
* 交换数组两个元素的位置
*
* @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];
}

/**
* 生成随机数组
*
* @param maxNum 最大数
* @param maxSize 数组最大大小
* @return 随机数组
*/
private static int[] generateArray(int maxNum, int maxSize) {
int[] arr = new int[(int) (maxSize * Math.random())];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (maxNum * Math.random());
}
return arr;
}

/**
* 复制数组
*
* @param arr 要复制的数组
* @return 复制的数组
*/
private static int[] copyArray(int[] arr) {
if (arr == null) {
return null;
}
int[] copy = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
copy[i] = arr[i];
}
return copy;
}

}

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