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, 0, len(li) - 1)
20         func(li, left, mid - 1)
21         func(li, mid + 1, right)
22 
23 
24 quick_sort(li, 0, len(li) - 1)
25 print(li)

猜你喜欢

转载自www.cnblogs.com/xjmlove/p/10176972.html
005