前言

本博文部分图片, 思路来自于剑指offer 或者编程珠玑

问题描述

08 将奇数排在偶数之前_算法

思路

书中给出了两种思路
思路一 : 前后两个索引, 将前面的指针初始化为第一个偶数的位置, 将第二个指针初始化为从后向前数的第一个奇数的位置, 然后 只要前面的索引小于后面的索引, 则交换两个索引对应的数据, 更新两个索引的位置 [更新为下一个奇数/ 偶数的位置]

思路二 : 更加扩展的一种方式, 将判断奇偶的函数作为参数传入, 这样就可扩展为其他的将满足函数条件的数据 移动到不满足条件的数据之前, 比如 有如下一个需求, 将小于10的元素 移动到其他的大于等于10的元素之前, 就可以将参数函数传入 “bool isCondition(int x, int minNum) { return x > minNum }”

参考代码

/**
 * file name : Test29OddBeforeEven.java
 * created at : 5:01:37 PM Jun 5, 2015
 * created by
 */

package com.hx.test04;

public class Test29OddBeforeEven {

    // 将指定的数组中奇数调整到偶数的前面
    public static void main(String []args) {

        int[] arr = {18, 19, 20, 22, 27, 28, 32, 34, 37, 38, 38, 48, 48, 4, 6, 11, 17  };

        oddBeforeEven01(arr);

        Log.log(arr);
    }

    // 将arr中的奇数调整到偶数的前面
    // 思路 : 两个索引, 一个指向第一个元素, 另一个指向最后一个元素
        // 只要head < tail, 则更新head, tail, head更新到下一个偶数, tail更新到下一个奇数  
        // 如果更新head, tail完毕 head小于tail   则交换head, tail的数据
    private static void oddBeforeEven01(int[] arr) {
        int head = 0, tail = arr.length - 1;

        while(head < tail) {
            while(isOdd(arr[head]) && head < tail ) {
                head ++;
            }
            while(isEven(arr[tail]) && head < tail ) {
                tail --;
            }

            if(head < tail) {
                Tools.swap(arr, head, tail);
            } else {
                break ;
            }
        }

    }

    // 判断x是否是奇数
    private static boolean isOdd(int x) {
        return !isEven(x);
    }

    // 判断x是否是偶数
    private static boolean isEven(int x) {
        return (x & 1 ) == 0;
    }

}

效果截图

08 将奇数排在偶数之前_java_02

总结

第二种思路 这里就没有去实现了, 可以使用 “java.lang.invoke”包[jdk 1.7或者之上]中相关api实现

注 : 因为作者的水平有限,必然可能出现一些bug, 所以请大家指出!