给定数组和num做分区

Posted laydown

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定数组和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;
}

}

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

以上是关于给定数组和num做分区的主要内容,如果未能解决你的问题,请参考以下文章

给定一组数字,返回所有其他数字的产品数组(无分区)

使用另一个数组的元素生成由一个数组定义的所有分区

如何在 C# 中找到包含给定分区的磁盘?

spark中的分区和自定义分区器中的重新分区和排序给出数组越界异常

合并一个 numpy 数组

2、kafka如何选定分区数量