使用Python實現的4種快速排序演算法

2022-08-03 06:06:11 字數 4650 閱讀 4210

快速排序演算法,總體來說就是選乙個基準值,把小於基準值的分一撥,把大於基準值的分到另一撥,然後遞迴。

有區別的是,分割槽演算法有差異,最直接的是,選個基準值,定義兩個列表(小值分割槽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 ...