概述
快排算法顾名思义就知道他是一个非常快速的排序算法,他其实是基于冒泡排序和分治思想而实现的。 快排中有一个比较重要的数叫基准数,这个基准数是为了创造出一个轴,而这个轴的左侧所有的数据都比这个数小,轴的右侧都比这个数大。进而再根据轴把原数据集分为两个子数据集,我们再对这两个数据集再进行创造基准数并把所有的数据根据基准数分成两部分。当我们把数据集分的足够小的时候,例如此时的子数据集为 [2,1,3],只有三个数,那么基准数为2,左侧必然是1, 右侧必然是3。这样我们是不是就实现了排序功能啦。 好了,下面我们来说一下,他具体怎么根据基准数进行操作的吧!
过程
- 我们随机选出这个基准数povit,此处我们选取数据集最左侧的数。
- 我们令最左侧的数为left(和povit不是同一个意思哦,povit只是我们随意选的数,只不过他恰好在最左侧罢了,当你读懂了这个算法,你就会明白),最右侧的数为right。
- 我们从数据集最右侧开始,向左依次比较该数是否比基准数小,如果比基准数小,就把该数赋予给left位置,并且这个位置设置为right(不要以为left位置的数据丢了,他可是我们的povit哦,是不是呀?)
- 我们再从数据集最左侧开始,向右依次比较该数是否比基准数大,如果比基准数大,就把该数赋予给right位置,并且把这个位置设置成left。
- 我们依次重复3.4.步骤,直到left和right重复(我们是不是到达了轴的位置啦,既然到达了轴的位置,那么就把轴的数给他不就刚好了吗?),我们把该位置(left or right)赋值为povit。
- 我们把povit 左侧和右侧切分开来,再次调用我们1--5步,直到把全部的数据集排完。
Code
def quick_sort(l, left=None, right=None):
if left is None and right is None:
left = 0
right = len(l) - 1
if left < right:
start, end, cursor = left, right, l[left]
while left < right:
while l[right] >= cursor and left < right:
right -= 1
l[left] = l[right]
while l[left] <= cursor and left < right:
left += 1
l[right] = l[left]
l[left] = cursor
print(l)
quick_sort(l, start, left - 1)
quick_sort(l, left + 1, end)
return l
总结
这个算法用文字描述可能会比较抽象,以后会补充图片来简易理解。