快速排序

快速排序

 

 思路:先取第一个元素把它归位,所有左边得元素都比归为得元素小,所有右边得元素都比归为得元素大,排完第一个元素,在排左边第一个元素把它在归位,归位条件:当归位得元素左边只有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)
View Code

 

posted @ 2022-10-08 20:53  断浪狂刀忆年少  阅读(31)  评论(0)    收藏  举报