《剑指Offer》题目:调整数组顺序使奇数位于偶数前面

题目描述:调整数组顺序使奇数位于偶数前

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

题目分析:

题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变。

Java代码:

public class ReOrderArray {

    //这种方法不能保证奇数和奇数,偶数和偶数之间的相对位置不变
    public static void reOrderArray(int [] array) {
        if (array.length == 0 || array.length == 1) return;
        int p1 = 0;
        int p2 = array.length-1;
        int temp = 0;
        while (p1 < p2){
            if (array[p1] %2 == 0){
                if (array[p2] % 2 == 0) p2--;
                else {
                    temp = array[p2];
                    array[p2] = array [p1];
                    array[p1] = temp;
                    p1++;
                    p2--;
                }
            }else {
                p1++;
            }
        }
    }

    //这种方法可以保证奇数和奇数,偶数和偶数之间的相对位置不变
    public static void reOrderArray1(int [] array){
        if (array.length == 0 || array.length == 1) return;
        int p1 = 0;
        int p2 = 1;
        int temp = 0;
        while ( p2 < array.length){
            //如果p1已经指向了偶数,这时开始向后移动p2,直到p2指向奇数,然后开始交换
            if (array[p1] % 2 == 0){
                if (array[p2] % 2 == 0){
                    p2++;
                }else {
                    //为保证相对位置不变,采用移位
                    temp = array[p2];
                    for (int i = p2; i > p1; --i){
                        array[i] = array[i-1];
                    }
                    array[p1] = temp;
                }
            }
            //如果p1指向的元素为奇数,p1向后移直到指向偶数,此时p2始终位于p1后面一位
            else {
                p1++;
                p2 = p1+1;
                continue;
            }
        }
    }
    public static void main(String[] args){
        int [] arr = new int[]{1,-3,4,-6,8,-9,7};
        reOrderArray1(arr);
        for (int i=0; i<arr.length; ++i){
            System.out.print(arr[i]+ " ");
        }

    }
}
技进乎艺,艺进乎道
原文地址:https://www.cnblogs.com/weekend/p/6979649.html