• 快速排序


    速排序

    #快速排序法
    '''
        思路分析:
            1.取一个元素p,使元素p归位。
            2.列表被p分成两部分,左边都比p小,右边都比p大,
            3.递归完成排序。
    
            关键点:
                1.归位
                2.递归
    
            partition函数里的逻辑:
                1.拿去左边第一个值假如是5,做比较,现在第一个位置为空
                2.从右边开始找比5小的数,放到那个空的位置。找到后移过去,自己的位置又位空,
                3.从左边找,比5大的数,移过去空的位置,以此类推。
                4.最后叠加,重合。
    
                5 1 7
    
                _ 1 7
    
                1 _ 7
    
            时间的复杂度: n*logn
            最坏情况:n*    如:987654321
            预防:随机找一个元素,就不找第一个元素,跟第一个元素对调一下。
    '''
    
    import random
    import copy
    import sys
    import time
    
    
    sys.setrecursionlimit(100000) #更改最大递归深度
    
    def cal_time(func):
        def wrapper(*args, **kwargs):
            t1 = time.time()
            result = func(*args, **kwargs)
            t2 = time.time()
            print("%s running time: %s secs." % (func.__name__, t2-t1))
            return result
        return wrapper
    
    
    def partition(li,left,right): #无序列表,最小值,最大值
        tmp =li[left]   #拿去左边第一个值
        while left < right:  #左边小于右边,就一直循环
            while left < right and li[right] >= tmp:
                right -= 1
            li[left] = li[right]    #把小于5的数,移到左边空的位置
            while left < right and li[left] <= tmp:
                left += 1
            li[right] = li[left]    #把大于的5的数,移到右边空的位置
        li[left] = tmp  #最后还需要归位。
    
        return left
    
    def _quick_sort(data,left,right):    #data=列表,左边,右边
        if left < right:    #至少两个元素,才会递归
            mid =partition(data,left,right)
            _quick_sort(data,left,mid-1)
            _quick_sort(data,mid+1,right)
    
    #加壳处理
    @cal_time
    def quick_sort(li):
        return _quick_sort(li,0,len(li)-1)
    
    #系统排序
    @cal_time
    def sys_sort(li):
        li.sort()
    
    li = list(range(100000))
    random.shuffle(li)
    li1 = copy.deepcopy(li)
    li2 = copy.deepcopy(li)
    
    sys_sort(li1)   #系统排序
    quick_sort(li2) #快排排序

    打印如下:

  • 相关阅读:
    ServletConfig类
    坑爹的去哪儿网订酒店经历
    python + opencv + pycharm +语音生成
    最近看到的工作要求
    pip in windows
    路由器外接硬盘做nas可行吗?
    阅读201706
    scrum学习
    学习concurrency programming进展
    Reactor/Proactor的比较 (ZZ)
  • 原文地址:https://www.cnblogs.com/zhongbokun/p/8576184.html
Copyright © 2020-2023  润新知