005---快速排序
# 快速排序
# 时间复杂度:O(NlogN) 当n等于16层时,他一共要执行四次func() 每一个func就是O(n) 所以就是 N * logN
# 最差的时间复杂度也就是O(n^2) 当然这种情况出现的几率不大
# 找一个基准数,暂且为左边第一个,用变量存起来,此时基准数的位置是空的
# 然后从右边开始找比基准数小的数。找到之后把最小数放到基准数的位置
# 此时最小数之前的位置又是空的,就反过来,从左边开始找,找比基准数大的数 放到空位置上面。
# 几次之后 保证左边的数都比基准数小,右边的数都比基准数大
# 最后递归调用完成排序
1 def func(li, left, right): 2 tmp = li[left] 3 while left < right: 4 while left < right and li[right] >= tmp: # 右边找比tmp小的数 5 right -= 1 # 比tmp大,right向左移动一位 6 li[left] = li[right] # 找到之后 右边的值写到左边空位上 7 while left < right and li[left] <= tmp: # 左边找比tmp大的数 8 left += 1 # 比tmp小,right向右移动一位 9 li[right] = li[left] # 找到之后 左边的值写到右边空位上 10 li[left] = tmp # 两个while一旦left与right碰头,也就是找到时候没有找到比自己大的数或者比自己小的数,跳出了循环,并且将tmp的值赋给left或right所在的索引 11 return left 12 13 14 li = [5, 7, 4, 6, 3, 1, 2, 9, 8] 15 16 17 def quick_sort(li, left, right):
18 if left < right:
19 mid = func(li, left, right)
20 quick_sort(li, left, mid - 1)
21 quick_sort(li, mid + 1, right)
22 23 24 quick_sort(li, 0, len(li) - 1) 25 print(li)