快速排序
快速排序

思路:先取第一个元素把它归位,所有左边得元素都比归为得元素小,所有右边得元素都比归为得元素大,排完第一个元素,在排左边第一个元素把它在归位,归位条件:当归位得元素左边只有1个或0个元素,当前得这个元素就排好了,依次递归去排序,排完左边在排右边

代码思路:
def quick_sort(data_lst, left, right): if left < right: mid_index = partition(data_lst, left, right) # 先用partition函数算出中间下标得位置 # 下面把列表分为2个部分, quick_sort(data_lst, left, mid_index - 1) # 左边列表 quick_sort(data_lst, mid_index + 1, right) # 右边列表 # left = right 只有一个元素 # left <right 有2个或2个以上得元素开始递归,否则无需递归
如何把第一个数归位到中间,思路:先从列表右边找比第一个数5小得,换到左边,再左边找比第一个数5大得数换到右边空位上

再看一个

继续

在看看

此时在找发现left和right重合了,说明位置在中间了

def partition(lst, left, right): tmp = lst[left] # 写出去 首先把第一个元素存起来,第一次left最左边是等于0 while left < right: # 只有left == right 循环结束,所以left <right一直循环 # 首先我要从右边找一个比tmp小得数,扔到左边得空位上 # 从右边开始循环 while left < right and lst[right] >= tmp: # 从右边找比tmp小得数 right -= 1 # 往左走一步 lst[left] = lst[right] # 把右边得数放到左边得空位上 # print('right',lst) while left < right and lst[left] <= tmp: left += 1 lst[right] = lst[left] # print('left',lst) lst[left] = tmp # 循环结束把tmp写入回来 return left # 返回left 或 right lst = [5, 7, 4, 6, 3, 1, 2, 9, 8] partition(lst, 0, len(lst) - 1) print(lst) def quick_sort(lst, left, right): if left < right: # 至少两个元素 mid_index = partition(lst, left, right) # 先用partition函数算出中间下标得位置 # 下面把列表分为2个部分, quick_sort(lst, left, mid_index - 1) # 左边列表 quick_sort(lst, mid_index + 1, right) # 右边列表 # left = right 只有一个元素 # left <right 有2个或2个以上得元素开始递归,否则无需递归 quick_sort(lst,0,len(lst)-1) print(lst)
幻想毫无价值,计划渺如尘埃,目标不可能达到。这一切的一切毫无意义——除非我们付诸行动。

浙公网安备 33010602011771号