2020年10月25日 调整数组顺序使奇数位于偶数前面

本文介绍了一种不改变奇数和偶数内部顺序的前提下,将数组中的所有奇数置于偶数前面的方法。通过两种不同的算法实现:一种使用辅助数组,简单但空间复杂度较高;另一种采用in-place算法,虽然实现较为复杂但不占用额外空间。

题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

思路一

比较憨批的写法

import java.util.ArrayList;
public class Solution {
    public void reOrderArray(int [] array) {
          ArrayList<Integer> ar = new ArrayList<>();
        for(int i =0;i<array.length;i++){
            if((array[i]&1 )==1){
                ar.add(array[i]);
            }
        }
        for(int i =0;i<array.length;i++){
            if((array[i]&1 )!=1){
                ar.add(array[i]);
            }
        }
        for (int i = 0; i < ar.size(); i++) {
            array[i] =ar.get(i);
        }
    }
}

即 使用了辅助的数组集合
时间复杂度:O(n)
空间复杂度:O(n)

in-place算法

如果不开辟额外数组该怎么做呢?
初始化操作:记录一个变量i表示已经将奇数放好的下一个位置,显然最开始i=0,表示还没有一个奇数放好。
j 表示数组的下标,初始值为0, 表示从下标0开始遍历。

  1. 如果遇到偶数,j++
  2. 如果遇到奇数,假设位置为j,就将此奇数插入到i所指的位置,然后i往后移动一个位置,在插入之前,显然会涉及到数据的移动,也就是将[i,j-1]整体往后移动。
  3. 直到整个数组遍历完毕,结束

在这里插入图片描述

import java.util.ArrayList;
public class Solution {
    public void reOrderArray(int [] array) {
        int i = 0;
        for (int j=0; j<array.length; ++j) {
          if ((array[j]&1)==1) {
              int tmp = array[j];
              for (int k=j-1; k>=i; --k) {
                  array[k+1] = array[k];
              }
              array[i++] = tmp;
          }
      }
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值