python演算法之排序演算法

2022-07-23 11:45:22 字數 2107 閱讀 1235

1

defbubble_sort(li):

2'''

本演算法複雜度為o(n**2)

'''3

for i in range(len(li)-1):#

列表長度為n,需要n-1趟

4'''

5i的取值個數為n-1

6i=0時,j的取值個數為n-1

7i=1時,j的取值個數為n-1-1

8i=2時,j的取值個數為n-1-1-1

9故對於i,j的取值個數為n-1-

10'''

11for j in range(len(li)-1-i):12#

若後面的數小於前面數,則兩數前後交換

13if li[j] > li[j+1]:

14 li[j],li[j+1] = li[j+1],li[j]

15 li = [random.randint(0,10000) for i in range(10000)]

16print

(li)

17bubble_sort(li)

18print(li)

#

選擇排序

#一趟排序記錄最小的數,放到第乙個位置

#再一趟排序記錄記錄無序區最小的數,放到第二個位置

#......

#演算法關鍵的:有序區和無序區,無序去最小數的位置

#本演算法複雜度為o(n**2)

defselect_sort(li):

for i in range(len(li)-1):

#需要排n-1趟

tmp = i #

tmp用來記錄無序區最小的數的索引

for j in range(i+1,len(li)):

'''j的範圍即無序區範圍

i=0時,j的範圍是1到最後

i=1時,j的範圍是2到最後

......

'''if li[j]tmp=j

li[i],li[tmp] =li[tmp],li[i]

#li = [23,35,3,23,23,2,1,4,34,23,4,3,23,5,23,2,34,23,23,2,34,2,4534,6,7,4,6,8,3,42]

#li = [random.randint(0,10000) for i in range(1000)]

#print(len(li),li)

#select_sort(li) # 用時0.053

#print(li)

#li = [random.randint(0,10000) for i in range(10000)]

#print(len(li),li)

#select_sort(li) # 用時6.057

#print(li)

插入排序

本演算法時間複雜度也是o(n**2)

1

definsert_sort(li):

2for i in range(1,len(li)):

3 tmp =li[i]

4 j = i-1#

j指手裡的牌的下標

5while j>=0 and li[j] >tmp:

6 li[j+1] =li[j]

7 j -= 1

8 li[j+1] =tmp9#

li = [3,2,5,6,4,3,6,7,5,7,6,45,7,8,8,34]10#

print(insert_sort(li))

11 li = [random.randint(0,10000) for i in range(1000)]

12print

(li)

13 insert_sort(li)#

0.049

14print(li)#

1516 li = [random.randint(0,10000) for i in range(10000)]

17print

(li)

18 insert_sort(li)#

5.46

19print(li)#

Python排序演算法之氣泡排序

顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快 對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 mylist 1,4,5,0,6 比較方式為 相鄰的兩個數字先進行比較,也就是mylist 0 和mylist 1 發現不是 的關係,就繼續比較mylist 1 和mylist 2 依次進行...

排序演算法之python氣泡排序

氣泡排序是一種交換排序 比較相鄰的連個關鍵字,把大的往後放,小的就向前移動,即冒泡 def bubblesort input list 如果待排序列為空,則直接返回空列表 if len input list 0 return sorted list input list for i in range...

排序演算法之python希爾排序

希爾 shell 排序是一種插入排序,同時也叫縮小增量排序,算是直接插入排序的乙個優化演算法,以其設計者希爾 donald shell 的名字命名,該演算法由 1959 年公布。將待排序列以一定的步長分成子串行,把子序列進行排序,然後會繼續以更小的步長進行分子序列,並將子串行排序,最終演算法以步長為...