剑指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

猜你喜欢

转载自blog.csdn.net/lzq20115395/article/details/79688786