快速排序
快速排序是通常被认为在同数量级(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