Python快速排序
思想:
- 每次选择一个数字,固定该数字的正确排序位置,即使得该数字左边的值全小于它,右边的值全大于它
- 该数字的左序列和右序列递归执行上一步
def quick_sort(alist, start, end):
'''快速排序'''
if start >= end:
return
mid_value = alist[start] # 将序列第一个值设为比较值(中间值)
low, high= start, end
while low < high: # 序列两端指针遍历,直至相遇
while low < high and alist[high] >= mid_value: # 从后往前找比中间值小的数字
high -= 1
alist[low] = alist[high] # 将该数字放置 low 位置
while low < high and alist[low] < mid_value: # 从前往后找比中间值大或相等的数字
low += 1
alist[high] = alist[low] # 将该数字放置 high 位置
alist[low] = mid_value # 此时序列 low 位置左边全为比中间值小的值,右边全为比中间值大的值,low 位置即为该数字排序后的正确位置
quick_sort(alist, start, low-1) # 递归左序列
quick_sort(alist, low+1, end) # 递归右序列
alist = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]
quick_sort(alist, 0, len(alist)-1)
print(alist)
[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
总结:
最优时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|
O ( n l o g n ) O(nlogn) O(nlogn) | O ( n 2 ) O(n^2) O(n2) | O ( n l o g n ) O(nlogn) O(nlogn) | O ( n l o g n ) O(nlogn) O(nlogn) | 不稳定 |
图片来源于:菜鸟教程