【A-排序】python实现八大排序算法之5-快速排序

快速排序

快速排序是通常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。

'''
Creat by HuangDandan
2018-08-14
[email protected]

快速排序,这是一个经典的算法,本文给出几种python的写法,供参考。
 特别是python能用一句话实现快速排序。

 #思路说明
 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
 (1) 分治法的基本思想
 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
 (2)快速排序的基本思想
 分解:设当前待排序的无序区为Lst[low..high],利用分治法可将快速排序的基本思想描述为:
 在Lst[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间Lst[low..pivotpos-1)和Lst[pivotpos+1..high],并使左边子区间中值均小于等于基准记录(不妨记为pivot),右边的子区间中所有值均大于等于pivot,而基准记录pivot则位于正确的位置上,它无须参加后续的排序。
 划分的关键是要求出基准记录所在的位置。划分的结果可以简单地表示为(注意pivot=Lst[pivotpos]):
 Lst[0,..,pivotpos-1]≤Lst[pivotpos]≤R[pivotpos+1,..,len(Lst)-1] 其中0≤pivotpos≤len(Lst)-1。
 求解:
 通过递归调用快速排序对左、右子区间快速排序。
 组合:
 因为当"求解"步骤中的两个递归调用结束时,其左、右两个子区间已有序。对快速排序而言,"组合"步骤无须做什么,可看作是空操作。
 #解决(@Python)

'''

#--------------------------------------实现1------------------------------------------
def quick_sort(Lst):
    LittleList = []
    PivotList = []
    LargeList = []
    if len(Lst) < 1: #当列表里面没有值的时候,返回空列表,没有该判断条件会报错
        return Lst
    else:
        for i in Lst:
            x = Lst[0]
            if i < x:
                LittleList.append(i)
            elif i > x:
                LargeList.append(i)
            else:
                PivotList.append(i)
        LittleList = quick_sort(LittleList)
        LargeList = quick_sort(LargeList)
        return LittleList+PivotList+LargeList

#-----------------------实现2(参考Python cookbook 第二版)--------------------------------
def quick_sort(Lst):
    if len(Lst) < 1: #当列表里面没有值的时候,返回空列表。没有该判断条件会报错
        return Lst
    else:
        Pivot = Lst[0]
        return quick_sort([x for x in Lst[1:] if x < Pivot]) + [Pivot] + quick_sort([x for x in Lst[1:] if x >= Pivot])
        # Lst[1:]表示从列表中的第二个元素开始进行判断分组,将第一个元素作为了参考值

#-----------------------实现3,简化实现2,python语言的特色(参考Python cookbook 第二版)--------------------------------
def quick_sort(Lst):
    return (quick_sort([y for y in Lst[1:] if y < Lst[0]]) + [Lst[0]] + quick_sort([y for y in Lst[1:] if y >= Lst[0]])) if len(Lst) > 1 else Lst
    #易错点:返回的是列表类型,因此中间的Lst[0]元素中间要增加[],变成列表形式

# #-----------------------实现4,简化实现1,python语言的特色--------------------------------------------------------------
def quick_sort(Lst):
    if not Lst:     
        return Lst
    else:
        Pivot = Lst[0]
        LittleList = [x for x in Lst[1:] if x < Pivot]
        LargeList = [x for x in Lst[1:] if x >= Pivot]
        return quick_sort(LittleList) + [Pivot] + quick_sort(LargeList)

#------------------------------实现4(使用匿名函数)---------------------------------------
quick_sort = lambda Lst : ( (len(Lst) <= 1 and [Lst]) or [ quick_sort( [x for x in Lst[1:] if x < Lst[0]] ) + [Lst[0]] + quick_sort( [x for x in Lst[1:] if x >= Lst[0]] ) ] )[0]




if __name__ == "__main__":
    Lst1 = [1,4,5,2,55,44,66,77,66,66,88,1]
    print(Lst1)
    print(quick_sort(Lst1))
    print('------------------------------------')

参考博客:https://www.jb51.net/article/123676.htm
https://segmentfault.com/a/1190000006546190?_ea=1082148
https://github.com/wvuu/algorithm/commit/ce1b9491c77db25146118e1afd5380d1f9022e9d

猜你喜欢

转载自blog.csdn.net/u010591976/article/details/81809933