快速排序原理
免费快速排序视频
快速排序思路:
- 取一个元素p(第一个元素),使元素p归位;
- 列表被p分成两部分,左边都比p小,右边都比p大;
- 递归完成排序
import random
def partition(li, left, right):
tmp = li[left]
while left < right:
while left < right and li[right] >= tmp: # 从右面找出比tmp小的数
right -= 1 # 往左走一步
li[left] = li[right] # 把右边的值写到左边空位上
while left < right and li[left] <= tmp:
left += 1 # 往右走一步
li[right] = li[left] # 把左边的值写到右边空位上
li[left] = tmp # 把tmp归位
return left
def quick_sort(data, left, right):
if left < right:
mid = partition(data, left, right)
quick_sort(data, left, mid-1)
quick_sort(data, mid+1, right)
li = list(range(1000))
random.shuffle(li)
quick_sort(li, 0, len(li)-1)
print(li)
时间复杂度:O(nlogn)
递归问题–递归深度
修改递归深度:
import sys
sys.setrecursionlimit(2000)
# 递归深度修改为2000
最坏情况–每次pass掉一个数字
9,8,7,6,5,4,3,2,1
1,8,7,6,5,4,3,2,9
1,8,7,6,5,4,3,2
8,7,6,5,4,3,2
2,7,6,5,4,3,8
2,7,6,5,4,3