快速排序演算法,總體來說就是選乙個基準值,把小於基準值的分一撥,把大於基準值的分到另一撥,然後遞迴。
有區別的是,分割槽演算法有差異,最直接的是,選個基準值,定義兩個列表(小值分割槽less和大值分割槽great),然後挨個比較,小的追加到less,大的追加到great
再有就是,選個基準值,先從右邊開始比,比基準值大的不管,比基準值小就和基準值換位置,換一次後,就去和左邊比,比基準值小的不管,比基準值大的又去換位置,略有些繞。
最後,還可以不遞迴,通過把分割槽節點儲存在棧裡來實現。
1#-*- coding: utf-8 -*-23
import
numpy as np4#
1)依次對比arr[0]和其他元素,比arr[0]小的話,就原地刪除,然後插入到arr[0]前面,基準值後移。大於等於,則不處理。然後遞迴5#
原地排序
6def
quick_sort1(arr,left,right):78
if left>=right:
9return
10 flag=left
11for i in range(left+1,right+1):
12if arr[flag]>arr[i]:
13 temp=arr[i]
14del
arr[i]
15arr.insert(flag,temp)
16 flag+=1
17 quick_sort1(arr,left,flag-1)
18 quick_sort1(arr,flag+1,right)19#
2)基準值arr[0],對比所有元素,比它小就追加到less後面,比它大就追加到great後面,相等就追加到pivot後面,然後遞迴20#
返回排序後的列表
21def
quick_sort2(arr):
22 less=
23 great=
24 pivot=
25if len(arr)<=1:
26return
arr27
else
:28 p=arr[0]
29for i in
arr:
30if i3132
elif i>p:
3334
else:35
36 less=quick_sort2(less)
37 great=quick_sort2(great)
38return less+pivot+great39#
2-2)基本思想同上,**更簡化
40def
quick_sort22(arr):
41if len(arr)<=1:
42return
arr43
else:44
return quick_sort22([i for i in arr[1:] if ifor i in arr[1:] if i>=arr[0]])46#
2-3)思路同上,更簡化的版本
47 quick_sort23=lambda xs:((len(xs)<=1 and [xs]) or [quick_sort23([x for x in xs[1:] if xfor x in xs[1:] if x>=xs[0]])])[0]
49 quick_sort24=lambda arr:arr if len(arr)<=1 else quick_sort24([x for x in arr[1:] if xfor x in arr[1:] if x>=arr[0]])
#lambda 引數:
取值1,如果滿足條件1,否則,取值2
515253#
3)定義兩個函式:分割槽和排序。分割槽是要把列表元素移動位置,直到基準值arr[0]移到中間(左邊都比它小,右邊都比它大)。排序則呼叫分割槽並遞迴54#
原地排序
55def
partition(arr,i,j):
56 p=arr[i]
57while i!=j:
58while iand p<=arr[j]:#
此處新增=,解決了之前遇到的序列中有重複值時死迴圈的問題
59 j-=1
60 arr[i]=arr[j]
61while iand p>arr[i]:
62 i+=1
63 arr[j]=arr[i]
64 arr[i]=p
65returni66
defquick_sort3(arr,i,j):
67if i68 mid=partition(arr,i,j)
69 quick_sort3(arr,i,mid-1)
70 quick_sort3(arr,mid+1,j)71#
3-2)上述思路的變體,分割槽函式變動,每次都比右邊是否比基準值大,大的話,j前移,否則,把arr[j]給到arr[i],然後i後移,arr[i]再給到arr[j],繼續上述迴圈
72def
partition2(arr,i,j):
73 p=arr[i]
74while i!=j:
75while iand p<=arr[j]:
76 j-=1
7778
while iand p>arr[j]:
79 arr[i]=arr[j]
80 i+=1
81 arr[j]=arr[i]
82 arr[i]=p
83returni84
defquick_sort32(arr,i,j):
85if i86 mid=partition2(arr,i,j)
87 quick_sort32(arr,i,mid-1)
88 quick_sort32(arr,mid+1,j) 89#
3-3)分割槽函式變動,基準值為最後乙個值,依次比較,如果比基準值小,就換到前面去,最後再把基準值換到中間。
90def
partition3(arr,i,j):
91 p=arr[j]
92 x=i-1
93for y in
range(i,j):
94if arr[y]<=p:
95 x+=1
96 arr[x],arr[y]=arr[y],arr[x]
97 arr[x+1],arr[j]=arr[j],arr[x+1]
98return x+1
99def
quick_sort33(arr,i,j):
100if i101 mid=partition3(arr,i,j)
102 quick_sort33(arr,i,mid-1)
103 quick_sort33(arr,mid+1,j)
104#
4)非遞迴方式,使用棧,思路類似previous,只是把切分邊界儲存在棧(用list實現)裡,\
105#
當只剩乙個元素時,跳出本次迴圈,進入下次迴圈,看下乙個區間裡元素值是否多於1個,直到棧空
106def
quick_sort4(arr,i,j):
107if j<=i:
108return
109 stack=
110stack.extend([i,j])
111while
stack:
112 left=stack.pop(0)
113 right=stack.pop(0)
114if right<=left:
115continue
116 x=left-1
117 p=arr[right]
118for y in range(left,right):#
此處迴圈不包括最後乙個元素,迴圈結束後,最後乙個元素換到中間
119if arr[y]<=p:
120 x+=1
121 arr[x],arr[y]=arr[y],arr[x]
122 arr[x+1],arr[right]=arr[right],arr[x+1]
123 stack.extend([left,x,x+2,right])
124125
126if
__name__=="
__main__":
127 s=np.random.randint(1,30,20).tolist()
128print
(s)129
#print(quick_sort24(s))
130 quick_sort4(s,0,len(s)-1)
131print(s)
Python單例模式的4種實現方法
encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...
Python單例模式的4種實現方法
python單例模式的4種實現方法 encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回c...
Python單例模式的4種實現方法
encoding utf 8 print 方法1 方法1,實現 new 方法 並在將乙個類的例項繫結到類變數 instance上,如果cls.instance為none說明該類還沒有例項化過,例項化該類,並返回 如果cls.instance不為none,直接返回cls.instance class ...