zoukankan      html  css  js  c++  java
  • java 数组偶数排在奇数前面

    输入一个整型数组,实现一个函数来调整该数组中的数字的顺序,使得所有偶数位于数组的前半部分,所有奇数位于数组的后半部分,希望时间复杂度尽量小

    第一种思路,从前往后遍历,找到第一个是偶数的,和数组第一位互换;以此类推;

    最坏的情况是全是偶数,依然还互换多次,可以增加判断条件 brr[x] 是奇数才进行互换(减少互换次数,但是增加了处理时间,这是因为整型数据互换的成本较低,针对大内存数据互换另当别论)

    int brr[] = {1,2,3,4,5,6};
    long time1 = System.nanoTime();
    int x = 0;
    for (int i = 0; i < brr.length; i++) {
        if (brr[i] % 2 == 0  ) { //if (brr[i] % 2 == 0 && brr[x] % 2 != 0 ) {
            int temp = brr[i];
            brr[i] = brr[x];
            brr[x] = temp;
            x++;
        }
    }
    System.out.println(Arrays.toString(brr));
    System.out.println(System.nanoTime()-time1);

    第二种思路,前半部分的奇数和后半部分的偶数互换位置,判断较多,互换次数少

     int brr[] = {1,2,3,4,5,6};
            long time2 = System.nanoTime();
            for (int i = 0, j = brr.length - 1; i < j; i++, j--) {
                while (brr[i] % 2 == 0 && i < j) {
                    i++;
                }
                while (brr[j] % 2 != 0 && j > 0) {
                    j--;
                }
                if(i<j){
                    int temp = brr[i];
                    brr[i] = brr[j];
                    brr[j] = temp;
                }
            }
            System.out.println(System.nanoTime() - time2);

    出于好奇,测试一下两种方法的耗时

    public static void main(String[] args) {
            int count = 10000;
            long swap = 0l;
            long comp = 0l;
            for (int c = 0; c < count; c++) {
                int[] arr2 = getInts();
                long start2 = System.nanoTime();
                int x = 0;
                for (int i = 0; i < arr2.length; i++) {
                    if (arr2[i] % 2 == 0) {
                        int temp = arr2[i];
                        arr2[i] = arr2[x];
                        arr2[x] = temp;
                        x++;
                    }
                }
                swap += System.nanoTime() - start2;
    
                ///////////////////////////////////////////////////////
    
                int[] arr = getInts();
                long start = System.nanoTime();
                int max = arr.length - 1;
                for (int i = 0, j = max; i < j; i++, j--) {
                    while (arr[i] % 2 == 0 && i < max) {
                        i++;
                    }
                    while (arr[j] % 2 != 0 && j > 0) {
                        j--;
                    }
    
                    if (i < j) {
                        int temp = arr[i];
                        arr[i] = arr[j];
                        arr[j] = temp;
                    }
                }
                comp += System.nanoTime() - start;
    
                ///////////////////////////////////////////////////////
            }
            System.out.println("COMP:" + comp / count);
            System.out.println("SWAP:" + swap / count);
        }
    
        private static int[] getInts() {
            int[] arr = new int[10000];
            for (int i = 0; i < arr.length; i++) {
                arr[i] = 2;
            }
            return arr;
        }

    有点像经典的“时间和空间” 问题

    void swap(int a, int b) //空间换时间
    {
         int c; 
            c=a; 
            a=b;
            b=a;
    }
    
    void swap(int a, int b) //时间换空间
    {
          a=a+b;
            b=a-b;
            a=a-b; 
    }

    PS : 有意思的是,多次调用其中某一种方法多次,耗时都是这种规律,第一次出现第二大值,但是中间必然出现一次最大值,其中究竟还不得知,估计要深入计算机原理去看,赋值操作和比较操作的耗时关系

    如发现问题,希望各路大神尽情指出。

  • 相关阅读:
    IE浏览器cookie存放在本地什么目录
    C# clickonce 部署自定义文件
    [C#.Net]C#连接Oracle数据库的方法
    Eclipse 插件一览
    登录名 '***' 拥有一个或多个数据库。在删除该登录名之前,请更改相应数据库的所有者。 (Microsoft SQL Server,错误: 15174)
    SqlServer_表结构查询_查询当前用户所有表名
    sqlserver怎么删除有外键关联的数据?
    springboot logback控制台中文输出乱码
    控制台运行JAVA的jar文件时乱码 / Gradle编译设置编码格式
    Python 算法之一
  • 原文地址:https://www.cnblogs.com/number7/p/9483954.html
Copyright © 2011-2022 走看看