剑指offer——调整数组顺序使奇数位于偶数前面

来源:互联网 发布:吸入麻醉药七氟烷mac值 编辑:程序博客网 时间:2024/06/05 00:31

1. 问题描述

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

2. 解决办法

这个解决方法应该很容易想到这样一个办法,那就是把奇数先全部找出来,然后把偶数全部找出来,然后把两个数组拼接起来就可以了。

这既是一个非常容易想到的办法,而且也是正常人做这件事情的过程。实际上,这样的时间复杂度是O(n),空间复杂度是O(n),我们一般比较注重时间复杂度,因为就目前情况来看,显然时间更值钱。

具体代码如下:

public static void reOrderArray(int[] array){        int[] odd=new int[array.length];        int[] even=new int[array.length];        int oddnum=0,evennum=0;        //找出奇数串,偶数串        for(int i=0;i<array.length;i++){            if(array[i]%2==0){                even[evennum++]=array[i];            }            else{                odd[oddnum++]=array[i];            }        }        //复原数组        for(int i=0;i<oddnum;i++){            array[i]=odd[i];        }        for(int i=0;i<evennum;i++){            array[oddnum+i]=even[i];        }    }

3. 一点思考

但可能作者的主要意图并不是如此,它等同一个排序算法,也就默认为偶数比奇数“大”,而且要一个稳定的算法。我们可以重新复习一下各种经典排序的时间复杂度与稳定性。
各种常用排序的时间复杂度

从上表可以看出,只有插入排序和磨泡排序与归并排序可以使用。而最好的归并排序,其时间复杂度为O(nlog2n),时间复杂度为O(1)。改写的部分只需要改写归并的过程即可。同样的,冒泡排序和插入排序的优势并不那么明显,因此我就不列举这两种算法的变种了。

0 0