調整數組順序使奇數位於偶數前面
劍指offer上的題目:
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變
https://www.nowcoder.com/practice/beb5aa231adc45b2a5dcc5b62c93f593?tpId=13&tqId=11166&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
注意此處題目的兩個要求:
- 排序後奇數位於偶數前面
- 奇數(偶數)與奇數(偶數)的相對位置不變
傳統方法:
- 設置兩個數組,遍歷原數組後分別保存奇數偶數,然後按順序輸出
這種方法時間複雜度爲O(n),但是空間複雜度較高。
如果沒有第二個要求,則使用快速排序的思想可以完成,本文使用歸併排序的思想
歸併思想:
class Solution:
def reOrderArray(self, array):
self.sort(array,1,len(array)) #注意這裏數組第一個元素下標是1
return array
def sort(self,array,p,r):
if p<r:
k=int((p+r)/2)
self.sort(array,p,k)
self.sort(array,k+1,r)
self.merge_sort(array,p,k,r)
def merge_sort(self,array,p,q,x):
l=[]
r=[]
for i in range(q-p+1):
l.append(array[i+p-1])
for j in range(x-q):
r.append(array[q+j])
i=0
j=0
for m in range(p-1,x):
if i<len(l) and (l[i]&1)==1:
array[m]=l[i]
i+=1
elif j<len(r) and (r[j]&1)==1:
array[m]=r[j]
j+=1
elif i<len(l) and (l[i]&1)==0:
array[m]=l[i]
i+=1
elif j<len(r) and (r[j]&1)==0:
array[m]=r[j]
j+=1