快速排序

速排序

#快速排序法
'''
    思路分析:
        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) #快排排序

打印如下:

原文地址:https://www.cnblogs.com/zhongbokun/p/8576184.html