13.调整数组顺序使奇数位于偶数前面

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:扫描一遍数组,
1. 用mark记录当前已经扫描了几个奇数。
2. 如果扫描到的数是奇数,就往当前mark插入当前数字,mark++
3.如果扫描到偶数,就把它存储到list中。
这样扫描完了,最后得到两个数组,
一个是array:mark前面全都是奇数的数组。
一个是list 按照原来相对位置排好的list.
最后只需要将list按照顺序,从array的mark位置开始覆盖,就得到满足题目要求的结果。
时间复杂度是:o(n)级别。(可是缺多开了一个空间,数据量大实用不到)

    public void reOrderArray(int [] array) {
        if (array.length == 0 || array == null) {
            return;
        }
        List<Integer> list = new ArrayList<Integer>();
        int mark = 0;
        for (int i = 0; i <array.length ; i++) {
            if (array[i] % 2 == 1) {
//                list.add(array[i]);
                array[mark] = array[i];
                mark++;
            }
            else {
                list.add(array[i]);
            }
        }
        for (int i = mark; i < array.length; i++) {
            array[i] = list.remove(0);
        }
    }

方法二 :对于每一个偶数后面的奇数都要调到偶数前面。有点贪心的感觉。
1. 从i开始,往后找到第一个偶数。
2. 从j(j=i+1)开始,往后找到第一个奇数。
3. 将数组中 从i到j-1的数字都往后挪,再将奇数放到i位置。依此往复。

public void reOrderArray(int [] array) {
            if (array.length == 0 || array == null) {
            return;
            }
            int i = 0,j;
            System.out.println(array.length);
            while (i < array.length) {
                while (i<array.length && array[i]%2!=0) {//找都偶数
                    i++;
                    System.out.println("i"+i);
                }
                j = i+1;
                System.out.println(j);
                while (j<array.length && array[j]%2==0) {//找都奇数
                    j++;
                }

                if (j < array.length) {
                    int temp = array[j];
                    for (int k = j-1; k >=i ; k--) {
                        System.out.println(array[k]);

                        array[k + 1] = array[k];
                    }
                    array[i++] = temp;
                }
                else
                {
                    break;
                }

            }

        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值