调整数组顺序使得奇数位于偶数之前

思路

  • 调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序
  • 从前往后遍历数组,如果发现偶数,那么在偶数之后的剩余元素中找出一个奇数,交换两数,使得奇数在前
  • 直到数组遍历完成

代码

import java.util.Arrays;

public class pra1220 {
    public static void main(String[] args) {
        //调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。
        int[] arr={2,4,9,7,6,5};
        System.out.print("Before change:");
        String result1= Arrays.toString(arr);
        System.out.println(result1);
        change(arr);
        System.out.print("After  change:");
        String result2= Arrays.toString(arr);
        System.out.println(result2);
    }

    public static void change(int[] arr) {
        int temp=0;
        for(int even=0;even<arr.length;even++){
            if(arr[even]%2==0){
                for(int odd=even+1;odd<arr.length;odd++){
                    if(arr[odd]%2!=0){
                        temp=arr[odd];
                        arr[odd]=arr[even];
                        arr[even]=temp;
                        break;
                    }
                }
            }
        }
    }

}

运行结果


如果给上面的题目再加一个条件,如果调整后的数组中的元素,奇数和奇数的相对位置不变,偶数和偶数的相对位置不变,应该怎么做呢?

思路

  • 由于相对位置不变,所以要求算法是稳定的.
  • 在这里考虑使用插入排序,已排区间为 [0,bound),待排区间为[bound,arr.length)
  • 我们将待排区间的第一个元素拿出来,如果它是一个奇数,那么我们在已排区间中,找到一个合适位置,将其插入;如果是一个偶数,不用调整,继续下一次循环即可.

代码

public class Solution {
    public int[] reOrderArray (int[] array) {
        for(int bound=1;bound<array.length;bound++){
            int v=array[bound];
            //如果是偶数,什么都不做,继续下一次循环即可
            if(((v-1)&1)==1){
               continue; 
            }
            int cur=bound-1;
            for(;cur>=0;cur--){
                if(((array[cur]-1)&1)==1){
                    array[cur+1]=array[cur];
                }else{
                    break;
                }
            }
            array[cur+1]=v;
        }
        return array;
    }
}

注意: ((v-1)&1)==1 用来判断v是否为偶数,采用位运算代替求余运算~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值