常見排序演算法的python實現

2021-10-14 11:43:38 字數 4232 閱讀 1265

def

bubble_sort

(arry)

: n =

len(arry)

#獲得陣列的長度

for i in

range

(n):

for j in

range(1

,n-i)

:if arry[j-1]

> arry[j]

:#如果前者比後者大

arry[j-1]

,arry[j]

= arry[j]

,arry[j-1]

#則交換兩者

return arry

def

select_sort

(ary)

: n =

len(ary)

for i in

range(0

,n):

min= i #最小元素下標標記

for j in

range

(i+1

,n):

if ary[j]

< ary[

min]

:min

= j #找到最小值的下標

ary[

min]

,ary[i]

= ary[i]

,ary[

min]

#交換兩者

return ary

def

insert_sort

(ary)

: n =

len(ary)

for i in

range(1

,n):

if ary[i]

< ary[i-1]

: temp = ary[i]

index = i #待插入的下標

for j in

range

(i-1,-

1,-1

):#從i-1 迴圈到 0 (包括0)

if ary[j]

> temp :

ary[j+1]

= ary[j]

index = j #記錄待插入下標

else

:break

ary[index]

= temp

return ary

def

shell_sort

(ary)

: n =

len(ary)

gap =

round

(n/2

)#初始步長 , 用round四捨五入取整

while gap >0:

for i in

range

(gap,n)

:#每一列進行插入排序 , 從gap 到 n-1

temp = ary[i]

j = i

while

( j >= gap and ary[j-gap]

> temp )

:#插入排序

ary[j]

= ary[j-gap]

j = j - gap

ary[j]

= temp

gap =

round

(gap/2)

#重新設定步長

return ary

def

merge_sort

(ary):if

len(ary)

<=1:

return ary

num =

int(

len(ary)/2

)#二分分解

left = merge_sort(ary[

:num]

) right = merge_sort(ary[num:])

return merge(left,right)

#合併陣列

defmerge

(left,right)

:'''合併操作,

將兩個有序陣列left和right合併成乙個大的有序陣列'''

l,r =0,

0#left與right陣列的下標指標

result =

while l<

len(left)

and r<

len(right)

:if left[l]

< right[r]:)

l +=

1else:)

r +=

1 result += left[l:

] result += right[r:

]return result

def

quick_sort

(ary)

:return qsort(ary,0,

len(ary)-1

)def

qsort

(ary,left,right)

:#快排函式,ary為待排序陣列,left為待排序的左邊界,right為右邊界

if left >= right :

return ary

key = ary[left]

#取最左邊的為基準數

lp = left #左指標

rp = right #右指標

while lp < rp :

while ary[rp]

>= key and lp < rp :

rp -=

1while ary[lp]

<= key and lp < rp :

lp +=

1 ary[lp]

,ary[rp]

= ary[rp]

,ary[lp]

ary[left]

,ary[lp]

= ary[lp]

,ary[left]

qsort(ary,left,lp-1)

qsort(ary,rp+

1,right)

return ary

def

heap_sort

(ary)

: n =

len(ary)

first =

int(n/2-

1)#最後乙個非葉子節點

for start in

range

(first,-1

,-1)

:#構造大根堆

max_heapify(ary,start,n-1)

for end in

range

(n-1,0

,-1)

:#堆排,將大根堆轉換成有序陣列

ary[end]

,ary[0]

= ary[0]

,ary[end]

max_heapify(ary,

0,end-1)

return ary

#最大堆調整:將堆的末端子節點作調整,使得子節點永遠小於父節點

#start為當前需要調整最大堆的位置,end為調整邊界

defmax_heapify

(ary,start,end)

: root = start

while

true

: child = root*2+

1#調整節點的子節點

if child > end :

break

if child+

1<= end and ary[child]

< ary[child+1]

: child = child+

1#取較大的子節點

if ary[root]

< ary[child]

:#較大的子節點成為父節點

ary[root]

,ary[child]

= ary[child]

,ary[root]

#交換 root = child

else

:break

python 實現常見排序演算法

coding utf 8 bubble sort 氣泡排序 時間複雜度最壞為o n2 最優的為n import time def bubble sort alist 氣泡排序 param alist return cur 1 while cur len alist 1 and len alist 1...

常見排序演算法Python實現

氣泡排序 最優時間複雜度 o n 最壞時間複雜度 o n 2 穩定性 穩定 def bubble sort alist 氣泡排序 for j in range len alist 1,0,1 count 0 for i in range j if alist i alist i 1 alist i ...

常見排序演算法 python實現

穩定性是指序列中相同的數字在排序後相對位置不發生改變 常見的且穩定的排序演算法有冒泡 歸併 插入,其餘的為非穩定的排序演算法 def bubble sort alist for j in range len alist 1 0,1 for i in range j if alist i alist ...