《剑指offer》调整数组顺序使奇数位于偶数前面 辅助空间

题目描述

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

思路

插入排序的时间复杂度有O(n^2)太高,所以直接考虑空间换时间,使用辅助空间来装奇数的数字和偶数的数字。

public class Solution {
    public void reOrderArray(int[] array) {
            int js = 0, os = 0, jj = 0, oo = 0;
            for (int i = 0; i < array.length; i++) {
                if (array[i] % 2 != 0)
                    js++;
            }
            os = array.length - js;
            int[] Arrjs = new int[js];
            int[] Arros = new int[os];
            for (int j = 0; j < array.length; j++) {
                if (array[j] % 2 != 0) {
                    Arrjs[jj] = array[j];
                    jj++;
                } else {
                    Arros[oo] = array[j];
                    oo++;
                }
            }
            for (int k = 0; k < array.length; k++) {
                if (k <= js - 1)
                    array[k] = Arrjs[k];
                else
                    array[k] = Arros[k - js];
            }
        }
}

冒泡排序思想:

public void reOrderArray(int [] array) {
    if(array == null)
        return ;

    for(int i = 1; i < array.length; i++){
        //存储当前值
        int temp = array[i];
        //当前值的前一个值
        int j = i - 1;
        //当前值为奇数
        if(array[i] % 2 != 0){
            //从当前值的前一个值开始查找,如果为奇数,不变化。如果为偶数,把偶数和它后一个数交换,也就是把偶数后移一位。循环把array里前i-1个数里的偶数全部后移,使当前奇数可以插到偶数前面。
            while(j >= 0){
                if(array[j] % 2 != 0){
                    break;
                }
                if(array[j]%2 == 0){
                    int t = array[j+1];
                    array[j+1] = array[j];
                    array[j] = t;
                    j--;
                }
            }
        }
        array[j+1] = temp;
    }
}

猜你喜欢

转载自blog.csdn.net/gsch_12/article/details/80996201