python 快速排序

原文

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jul 12 13:04:05 2021

@author: ledi
"""

def quick_sort(alist, start, end):
    """快速排序"""
    if start >= end:  # 递归的退出条件
        return
    mid = alist[start]  # 设定起始的基准元素
    print('mid=',mid)
    low = start  # low为序列左边在开始位置的由左向右移动的游标
    
    print('low=',low)
    high = end  # high为序列右边末尾位置的由右向左移动的游标
    
    print('high=',high)
    while low < high:
        # 如果low与high未重合,high(右边)指向的元素大于等于基准元素,则high向左移动
        
        print('mid=',mid,'alist[high]=',alist[high],'alist[low]=',alist[low])
        while low < high and alist[high] >= mid:
            high -= 1
            print('high-->',high)
        alist[low] = alist[high]  # 走到此位置时high指向一个比基准元素小的元素,将high指向的元素放到low的位置上,此时high指向的位置空着,接下来移动low找到符合条件的元素放在此处
        print('alist=',alist) 
        # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
        print('mid=',mid,'alist[high]=',alist[high],'alist[low]=',alist[low])
        while low < high and alist[low] < mid:
            low += 1
            print('low-->',low)
        alist[high] = alist[low]  # 此时low指向一个比基准元素大的元素,将low指向的元素放到high空着的位置上,此时low指向的位置空着,之后进行下一次循环,将high找到符合条件的元素填到此处
        print('alist=',alist)
    
    print('##'*12)
    # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置,左边的元素都比基准元素小,右边的元素都比基准元素大
    alist[low] = mid  # 将基准元素放到该位置,
    # 对基准元素左边的子序列进行快速排序
    quick_sort(alist, start, low - 1)  # start :0  low -1 原基准元素靠左边一位
    # 对基准元素右边的子序列进行快速排序
    quick_sort(alist, low + 1, end)  # low+1 : 原基准元素靠右一位  end: 最后



if __name__ == '__main__':
    alist = [ 55, 44, 33, 22, 11]
    quick_sort(alist, 0, len(alist) - 1)
    print(alist)



posted @ 2022-08-19 22:49  luoganttcc  阅读(13)  评论(0)    收藏  举报