快速排序
class QuickSort2(object):
def sort(self, lst, left_bound, right_bound):
"""
:param lst: 待排序数组
:param left_bound: 左边界
:param right_bound: 右边界
:return: 返回排好序的数组
"""
if left_bound >= right_bound: # 只有一个数甚至是空数组
return
# 找出中轴应该在的位置
mid = self.partition(lst, left_bound, right_bound)
# 中轴左边的排序找中轴
self.sort(lst, 0, mid - 1) # 中轴已经找到,左边新的边界应该是中轴前面一个
# 中轴要右边的排序找中轴
self.sort(lst, mid + 1, right_bound) # 右边的新边界是中轴后面一个
def partition(self, lst, left_bound, right_bound):
"""找中轴,一般假设最后一个数为中轴,但是最好随机选择一个作为中轴"""
# 假设一个中轴
axis = lst[right_bound]
# 设置左边哨兵和右边哨兵的起始位置
left = left_bound
right = right_bound - 1 # 因最右边那个数用作中轴了,所以哨兵退一位
# 寻找中轴位置
while left <= right: # 哨兵左不能超过哨兵右,
while left <= right and lst[left] <= axis:
left += 1 # 哨兵所在位置比中轴小,数字位置正确,哨兵前进
while left <= right and lst[right] > axis: # 左边选了等于右边就不能选等于
right -= 1 # 哨兵所在位置比中轴大,数字位置正确,哨兵前进
# 左右哨兵都移动完成以后,证明左右哨兵所在位置为数字不正确的位置
# (比中轴小的在中轴左边,比中轴大的在中轴右边),交换两个哨兵所在的数字
if left < right: # 左哨兵小于右哨兵才交换,等于都不行
lst[left], lst[right] = lst[right], lst[left]
# 将本轮中所有的数字放到正确位置以后,将中轴放到应该放的位置(因左边哨兵小于等于中轴,所以最后哨兵在的位置是中轴的位置,交换)
lst[left], lst[right_bound] = lst[right_bound], lst[left]
return left