快排采用了分治法的思想和递归的方式进行排序,每次递归都会确定一个位置的数值(此处是位置i
),且大于等于左侧所有值,小于等于右侧所有值。
def _quicksort(l, left, right):
# left 到 right 里的都是未经过排序的
if left >= right:
return
i, j = left, right
# 如果list原本是降序排序,则算法时间会退化为O(n^2)
# 互换最左元素和中间元素可预防这种情况
mid = left + (right - left / 2)
l[left], l[mid] = l[mid], l[left]
key = l[left]
while i < j:
# 先从后往前扫,直到小于key
while i < j and key >= l[j]:
j -= 1
a[i] = a[j] # 此时a[i]已经backup到了key,可以放心覆盖
# 再从前往后扫,直到大于key
while i < j and key <= l[j]:
i += 1
a[j] = a[i] # 此时a[j]已经放到原本的a[i],可以放心覆盖
# 不断重复j往前,i往后,直到 i == j
# 此时i == j
a[i] = key
_quicksort(l, left, i - 1)
_quicksort(l, i + 1, right)
def quicksort(l):
_quicksort(l, 0, len(l) - 1)
if __name__ == "__main__":
l = [66, 42, 52, 78, 99, 11]
quicksort(l)
print(l)
# [11, 42, 52, 66, 78, 99]
参考文献
百度百科:快速排序算法