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

题目描述:

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

 此题应该注意的是要求奇数与奇数,偶数与偶数之间的相对位置不变,则不能使用类似快排的思想,若不要求相对位置,只要求奇数在偶数前,则可以使用,代码如下:

 public void reOrderArray(int [] array) {
        if(array.length == 0){
            return;
        }
        int high = array.length - 1;
        int low = 0;
        while(low < high){
            //从前向后找,找到第一个偶数
            while(low < high && array[low] % 2 == 1){
                low ++;
            }
            //从后向前找,找到第一个奇数
            while(low < high && array[high] % 2 == 0){
                high --;
            }
            //交换
            int temp = array[low];
            array[low] = array[high];
            array[high] = temp;
        }
}    

算法思想:

  (1)类似插入排序,当前数是奇数,就往前找,遇到偶数就往它前面插

public class Solution {
    public void reOrderArray(int [] array) {
        for(int i = 1; i < array.length;i++){
            //当当前数为奇数时
            if(array[i] % 2 == 1){
                int t = i;
                //寻找该奇数前面的偶数,并与其交换,同时更新当前奇数的下标
                for(int j = t; j > 0;j--){
                    if(array[j-1] % 2 == 0){
                        int temp = array[t];
                        array[t] = array[j-1];
                        array[j-1] = temp;    
                        t = j-1;
                    }
                }
            }
        }
    }
}    

  (2)借助栈

 public void reOrderArray(int [] array) {
       Stack<Integer> stack = new Stack();
        for(int i = 0; i < array.length; i++)
        {
            if(array[i] % 2 == 1)
                stack.push(array[i]);
        }
        for(int i = 0; i < array.length; i++)
        {
            if(array[i] % 2 == 0)
                stack.push(array[i]);
        }
        for(int i = array.length-1; i > 0;i--){
            array[i] = stack.pop();
        }
    }

扩展:在编程设计的时候,可以考虑将判断当前数是奇数还是偶数的方法提取出来,增强方法的通用性。

原文地址:https://www.cnblogs.com/suixue/p/5818137.html