class Partition:
# partition过程
# 给定一个数组arr,和一个整数num。请把小于等于num的数放在数组左边,
# 大于num的数放在数组的右边。这里num为数组的r
# 要求额外空间复杂度为O(1),时间复杂度为O(N)
def partition(self, arr, l, r):
if l > r:
return -1
if l == r:
return l
less_equal = l-1
index = l
# index < r ,则不包括r位置。
# 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
while index < r:
if arr[index]<=arr[r]:
less_equal += 1
self.swap(arr, index, less_equal)
index += 1
less_equal += 1 # 大于区域的第一个
# 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
self.swap(arr, less_equal, r)
return less_equal
def swap(self, arr, i, j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
partition问题进阶:荷兰国旗问题的划分
class Partition:
# arr[L...R] 玩荷兰国旗问题的划分,以arr[R]作划分值
# 三个部分,<arr[R] ==arr[R] >arr[R]
# return ==区域
def netherlandsFlag(self, arr, l, r):
if l > r:
return [-1, -1]
if l == r:
return [l, r]
less = l-1 # <arr[R]区域左边界
index = l # 从l位置开始遍历
more = r # >arr[R]区域左边界,先把r位置包住,partition过程中,r先不动
while index < more:
if arr[index] == arr[r]:
index += 1
elif arr[index] < arr[r]:
less += 1
self.swap(arr, index, less)
index += 1
else:
more -= 1
self.swap(arr, index, more)
# l...less less+1...more-1 more...r-1 r
# l...less less+1...more mor+1...r
# 最后,将大于区域的第一个与r交换,此时r是==r的最后一个
self.swap(arr, more, r)
return [less+1, more]
def swap(self, arr, i, j):
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp