python排序實現 經典排序演算法python實現

2021-10-18 15:27:18 字數 2735 閱讀 2836

一、氣泡排序

1、從前往後相鄰元素進行對比,如果前乙個元素大於後乙個元素則交換,將最大的元素「浮」到最後的位置上

2、再對前n-1個元素進行相同操作

3、持續對越來越少的元素進行相同操作,每一輪都選出當前的最大數,直到沒有任何元素需要比較

優化:1、若某一輪沒有進行任何交換,則說明已經有序,不需要再進行迭代,可以用乙個標誌來記錄這一狀態

2、可以記錄下每一輪最後一次進行交換的位置,這個位置後面的資料已經有序不需要再進行比較,因此可以確定下一輪的迭代範圍

defbubble_sort(list):

n=len(list)

k=nfor i inrange(n):

label= 1

for j in range(1,k):if list[j-1]>list[j]:

list[j],list[j-1]=list[j-1],list[j]

k=jlabel=0iflabel:returnlistreturnlist

a= [8,7,6,5,4]print(bubble_sort(a))

二、選擇排序

1、從未排序列表選出最小數,放入已排序列表第一位

2、再從剩餘的未排序列表選出最小數,放入已排序列表末尾

3、以此類推,直到所有元素排序完畢

defselest_sort(list):

n=len(list)for i inrange(n):

min=ifor j inrange(i,n):if list[j]

min=j

list[min],list[i]=list[i],list[min]returnlist

a= [8,7,6,5,4]print(selest_sort(a))

三、插入排序

對每個未排序的資料,在已排序資料中從後向前掃瞄,尋找相應位置並插入

1、從第乙個元素開始,看作已排序資料

2、取出下乙個元素,從後向前掃瞄已排序資料,尋找插入位置

3、以此類推,直到所有資料都有序

definsert_sort(list):

n=len(list)for i in range(1,n):

temp=list[i]

index=ifor j in range(i,-1,-1):if list[j]>temp:

list[j+1] =list[j]

index=j

list[index]=tempreturnlist

a= [8,7,6,5,4]print(insert_sort(a))

四、希爾排序

希爾排序又稱增量遞減排序,是一種高階的插入排序演算法

1、首先將列表以step=n//2為步長進行劃分,對每個分組進行插入排序

2、將步長縮小至step= step//2,再進行插入排序

3、直到步長縮減為1,進行最後一次插入排序

defshell_sort(list):

n=len(list)

step= n//2

while step>=1:for i inrange(step,n):while i>=step and list[i-step]>list[i]:

list[i-step],list[i]=list[i],list[i-step]

i= i -step

step= step//2

returnlist

a= [8,7,6,5,4]print(shell_sort(a))

五、快速排序

插入排序採用分治法的思想,先確定乙個基準數,然後將小於等於基準數的放到左邊,大於基準數的放大右邊

再對左右分區分別重複上述步驟,直到每個分割槽只剩下乙個數

defquick_sort(list):return qsort(list,0,len(list)-1)defqsort(list,left,right):if left>=right:returnlist

base=list[left]

l=left

r=rightwhile l= base and l

r= r-1

while list[l]<=base and l

l= l+1list[l],list[r]=list[r],list[l]

list[left],list[l]=list[l],list[left]

qsort(list,left,l-1)

qsort(list,r+1,right)return list

六、歸併排序

歸併排序同樣採用分治法的思想,首先遞迴對列表進行分解,再遞迴進行合併

合併的時候,比較兩個列表的最前面的數,誰小就先取誰,取了後相應的指標就往後移一位。然後再比較,直至乙個列表為空,最後把另乙個列表的剩餘部分複製過來即可。

defmerge_sort(list):if len(list)<=1:returnlist

n=len(list)

num= n//2left=merge_sort(list[:num])

right=merge_sort(list[num:])returnmerge(left,right)defmerge(left,right):

l=0r=0

result=while l

l= l+1

else:

r= r+1result= result+left[l:]

result= result+right[r:]returnresult

a= [8,7,6,5,4]print(merge_sort(a))

Python實現經典排序演算法

import random lis list range 100 random.shuffle lis print lis def bubblesort arr for i in range 1 len arr for j in range 0 len arr i if arr j arr j 1 ...

Python 實現經典排序演算法

穩定的排序演算法 氣泡排序 插入排序 歸併排序和基數排序。不是穩定的排序演算法 選擇排序 快速排序 希爾排序 堆排序。a 80,15,45,35,88,46,55,66,22,99,0,1,100 for j in range 0,len a for i in range 0,len a 1 if ...

Python實現經典排序演算法 堆排序

上次說到了經典演算法選擇排序,感覺是比較簡單的演算法,這一次說一說稍微有點難度的堆排序。堆排序的時間複雜度要明顯優於前面的氣泡排序,插入排序和選擇排序 侷限於n較大時 先來講講堆 二叉堆 是乙個陣列,它可以近似被看作是乙個完全二叉樹。樹上每乙個節點對應乙個元素,除了最底層外,該樹是完全充滿的,而且是...