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;
    }

    }

    /* 如有错误,欢迎批评指正 */
  • 相关阅读:
    VC(VISUAL_C++)虚拟键VK值列表
    关于新一轮QQ Tencent://Message 在线联系
    (记录) sql exists 应用及 order by注意点
    (记录)IE8 ..样式错乱解决
    jquery 关于ajax 中文字符长度过长后不执行
    DataList 嵌套绑定CheckBoxList [记录, 以免忘记哈.]
    (记录)MSSQL 的一些应用 查询数据统计适用 添加月份日号作为行记录
    数据结构回顾算法
    Modeling Our World笔记
    数据结构2数组
  • 原文地址:https://www.cnblogs.com/laydown/p/12813247.html
Copyright © 2011-2022 走看看