劍指offer——調整數組順序使奇數位於偶數前面


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)。改寫的部分只需要改寫歸並的過程即可。同樣的,冒泡排序和插入排序的優勢並不那么明顯,因此我就不列舉這兩種算法的變種了。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com