劍指offer-調整數組順序使奇數位於偶數前面(python)

調整數組順序使奇數位於偶數前面

劍指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
点赞