原理思路
快速排序也是分而治之思想的典范,通过递归解决问题。思路:1. 找到简单的基线条件(递归出口);2. 确定如何缩小问题的规模,使其符合基线条件。
详细的原理可以参考 这篇文章坐在马桶上看算法:快速排序
步骤归纳:
- 排序数组为collection,游标left从a的最左边开始,游标right从最右边开始
- 把pivot记为数组第一个数(即collection[left]),作为数组左右的分界值
- 从右边开始向左移动游标(right = right - 1)直到找到第一个小于pivot的数,存储在collection[left]当中
- 从左边开始向右移动游标(left = left + 1)直到找到第一个大于pivot的数,存储在collection[right]当中
- 重复上述两步直到两个游标相遇
- 将pivot放置到collection[left]位置上
- 随后递归地将pivot左右两部分分别排序!(递归)
核心思想:每次选取一个基准值,找到其位置,其他数如果大于基准值,放在基准值左侧,如果大于基准值,放在基准值右侧。
代码实现
通用版本
def quick_sort(collection, low, high):
# 快速排序
if low >= high:
return collection
else:
pivot = collection[low] # 把第一个作为基准值
left = low
right = high
while left < right:
while left < right and collection[right] >= pivot:
right -= 1 # 右边的哨兵左移一个
collection[left] = collection[right]
while left < right and collection[left] <= pivot:
left +=1 # 左边的哨兵右移一个
collection[right] = collection[left]
collection[right] = pivot # 两个哨兵相遇时则说明找到基准值的位置
quick_sort(collection, low, left-1) # 递归左半部分
quick_sort(collection, left