输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
快速排序的思想。为了减少交换次数,直接使用两个索引low
和high
分别向右、向左进行检索直到找到满足要求的值为止,进行交换。这里使用了一个扩展函数,用来表示通用方法func
。
class Solution:
def reorder_array(self, array):
if not array or len(array) == 1:
return array
return self.reorder_common(array, self.is_even)
def reorder_common(self, array, func): # 通用方法func
low, high = 0, len(array)-1
while low < high: # 结束条件,不包含等于情况
while low < high and not func(array[high]): # 向左检索
high -= 1
while low < high and func(array[low]): # 向右检索
low += 1
array[low], array[high] = array[high], array[low] # 交换
# print(low, high)
return array
def is_even(self, value):
if value & 0x1 == 1:
return True
else:
return False
st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))
使用设置支点的快速排序方法来操作。
class Solution:
def reorder_array(self, array):
if not array or len(array) == 1:
return array
return self.reorder_common(array, self.is_even)
def reorder_common(self, array, func): # 通用方法func
low, high = 0, len(array)-1
pivot = array[low]
while low < high: # 结束条件,不包含等于情况
while low < high and not func(array[high]): # 向左检索
high -= 1
array[low] = array[high] # 赋值给低地址
while low < high and func(array[low]): # 向右检索
low += 1
array[high] = array[low] # 赋值给高地址
array[low] = pivot
return array
def is_even(self, value):
if value & 0x1 == 1:
return True
else:
return False
st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))
直接分别提取符合要求的值后进行合并。
class Solution:
def reorder_array(self, array):
if not array or len(array) == 1:
return array
return self.reorder_common(array, self.is_even)
def reorder_common(self, array, func): # 通用方法func
left = [au for au in array if func(au)] # 符合要求的左半区
right = [au for au in array if not func(au)] # 符合要求的右半区
return left + right
def is_even(self, value):
if value & 0x1 == 1:
return True
else:
return False
st = Solution()
seq = [2, 4, 6, 8, 1, 3, 5, 7]
print(st.reorder_array(seq))
(最近更新:2019年09月21日)