博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 数组偶数排在奇数前面
阅读量:6760 次
发布时间:2019-06-26

本文共 2694 字,大约阅读时间需要 8 分钟。

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

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

最坏的情况是全是偶数,依然还互换多次,可以增加判断条件 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

 

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

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

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

 

 

转载于:https://www.cnblogs.com/number7/p/9483954.html

你可能感兴趣的文章
HTML中Select的使用具体解释
查看>>
《推荐系统》--基于知识推荐
查看>>
Java synchronized
查看>>
mysql大内存高性能优化方案
查看>>
scu 4436: Easy Math 水题
查看>>
VSTO 学习笔记(十二)自定义公式与Ribbon
查看>>
[再寄小读者之数学篇](2015-06-24 Series)
查看>>
【Linux】linux常用基本命令
查看>>
4-python学习——数据操作
查看>>
Oracle函数
查看>>
Unity3D学习笔记第一课
查看>>
【redis使用全解析】常见运维操作
查看>>
hdu2377Bus Pass(构建更复杂的图+spfa)
查看>>
Vc6.0打开该文件坠毁
查看>>
[LeetCode] Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最小共同父节点
查看>>
EasyUI-DataGrid多线动态实现选择性合并
查看>>
2015第29周三
查看>>
hdu5024(dp)
查看>>
算法-无向图(连通分量,是否有环和二分图)
查看>>
IOS runtime动态运行时一
查看>>