剑指offer 题21:调整数组顺序使奇数位于偶数前

题目:输入个整数数组, 实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

        我们可以维护两个指针:第一个指针初始化时指向数组的第一个数字,它只向后移动:第二个指针初始化时指向数组的最后一 个数字,它只向前移动。在两个指针相遇之前,第个指针总是位于第二个指针的前面。如果第一个指针指向的数字是偶数,并且第二个指针指向的数字是奇数,则交换这两个数字。下面以一个具体的例子,如输入数组(1,2, 3,4, 5)来分析这种思路。在初始化时,把第一个指针指向数组第- 个数字1,而把第二个指针指向最后一个数字5,如图3.6(a) 所示。第一个指针指向的数字1是一个奇数,不需要处理,我们把第一个指针向后移动,直到碰到一个偶数2。此时第二个指针已经指向了奇数因此不需要移动。此时两个指针指向的位置如图3.6(b)所示。这时候我们发现偶数2位于奇数5的前面,符合交换条件,于是交换这两个指针指向的数字,如图3.6 (c)所示。饼好小声型接下来我们继续向后移动第个指针, 直到碰到下一个偶数4,并向前移动第二个指针,直到碰到第一个奇数3,如图3.6 (d)所示。我们发现第二个指针已经在第一个指针的前面了,表示所有的奇数都已经在偶数的前面了。此时的数组是{1,5,3, 4, 2},的确是奇数位于数组的前半部分而偶数位于数组的后半部分。


import java.util.ArrayList;

public class ReorderArray {

    public static void main(String[] args) {

        // TODO Auto-generated method stub

        int [] array = {1, 2, 3, 4, 5};

        reOrderArray(array);

    }


    public static void reOrderArray (int [] array) {

        if(array == null)

            return;

        int begin = 0;

        int end = array.length - 1;

        int temp = 0;

        while(begin < end) {

            //后移begin直到它指到偶数

            while(begin < end && ! isEven(array[begin]))

                begin++;

            //前移end直到它指到奇数

            while(begin < end && isEven(array[end]))

                end--;

            if(begin < end) {

                temp = array[begin];

                array[begin] = array[end];

                array[end] = temp;

            }

        }

    }


    public static boolean isEven(int n) {

        return (n & 1) == 0;

    }

}

你可能感兴趣的:(剑指offer 题21:调整数组顺序使奇数位于偶数前)