zoukankan      html  css  js  c++  java
  • 给定数组和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;
    }

    }

    /* 如有错误,欢迎批评指正 */
  • 相关阅读:
    使用边缘计算来改变5G世界中的网络
    解开关于人工智能的六个迷思
    哪些数据将成为区块链系统的关键数据?
    如何通过7个步骤构建机器学习模型
    人工智能的发展体现了人类社会由实向虚的趋势
    5G技术与人工智能的智能结合
    量子计算总是混合的,这需要不断协调
    7.5省队集训 tree
    bzoj2989&4170: 数列
    bzoj1010: [HNOI2008]玩具装箱toy
  • 原文地址:https://www.cnblogs.com/laydown/p/12813247.html
Copyright © 2011-2022 走看看