调整数组顺序使奇数位于偶数前面
剑指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