演算法筆記(三) 氣泡排序和歸併排序

2022-02-24 11:44:17 字數 2880 閱讀 8268

(一)氣泡排序

氣泡排序的作用就是反覆交換相鄰未按次序排列的資料。

1

#氣泡排序實現,公升序版本

2def

bubblesort(data):3#

例如:data = [3,2,1], 很明顯迴圈檢查 data[0] > data[0+1] data[1] > data[1+1] 這2個表示式是否成立就行了4#

不需要也不可能去檢查 data[2] > data[2+1]是否成立,所以第一重for迴圈的執行次數是列表長度 - 1

5for i in range(len(data)-1):6#

第二重for迴圈每執行一輪都會排好乙個資料,所以下一輪的執行次數在這次的基礎上-1(即-i)7#

不減這個i不影響最終的排序結果,就是會執行很多沒必要執行的迴圈,因為已經排好序的資料還一直在比較

8for j in range(len(data)-1-i):

9if data[j] > data[j+1]:

10 data[j],data[j+1] = data[j+1],data[j] #

交換相鄰的資料

11print(j,data)#

這個print是為了看輸出,便於理解加上的,實際可以去掉

12return

data

1314 a = [11,8,7,3,1]

1516

17print(bubblesort(a))

看下面這張圖,不難發現,第二重for迴圈每一輪迴圈結束後都會排好乙個資料

第一輪結束後是:[8, 7, 3, 1, 11],不難發現,11是排序好了的,所以第二輪的迴圈次數在這次的基礎上-1就行了,即len(data)-1-i

第二輪結束後是:[7, 3, 1, 8, 11],不難發現,8,11是排序好了的,所以第三輪的迴圈次數在這次的基礎上-1就行了,即len(data)-1-i。後面都是一樣的道理

第三輪結束後。。。。

第四輪結束後。。。。

降序版本
1

#氣泡排序實現,降序版本

2def

bubblesort(data):

3for i in range(len(data)-1):

4for j in range(len(data)-1-i):

5if data[j] < data[j+1]:

6 data[j],data[j+1] = data[j+1],data[j] #

交換相鄰的資料

7return

data

89 a = [3,2,23,11,8,6,5,10,12,15]

1011

12print(bubblesort(a))

(二)    歸併排序分為2個過程 :1、分割 2、歸併

例如:對列表[5,2,4,7,1,3,2,6] 進行歸併排序,過程是這樣的

(1)分割:將列表分割,直到列表長度為1,然後開始歸併

(2)歸併:

#分割資料

2def

mergesort(a):3#

列表長度等於1時,停止分割,返回該列表

4if len(a) == 1:

5returna6

else:7

#//運算子返回商的整數部分,例如3//2 ,返回的就是18#

獲取列表元素中間的索引

9 mid = len(a) // 2

10 left = a[:mid]#

擷取(列表)索引0到mid之間的資料(不包括索引為mid的資料)

11 right = a[mid:] #

擷取(列表)索引mid之後的所有資料(包括索引為mid的資料)12#

遞迴呼叫自身繼續分割,直到列表長度為1為止

13 l =mergesort(left)

14 r =mergesort(right)15#

呼叫merge合併資料

16return

merge(l,r)

1718

#合併資料

19def

merge(l,r):

20 result =

21while len(l) > 0 and len(r)>0:22#

判斷哪個資料比較大,將比較小的資料新增到result列表中

23if l[0] <=r[0]:24#

pop(0)是從列表刪除索引為0的資料並返回

2526

else:27

28#其中乙個列表的資料為空後會退出while迴圈,將另乙個列表的資料直接新增到result中

29result.extend(l)

30result.extend(r)

31return

result

3233 a = [5,2,4,7,1,3,2,6]

3435

36print(mergesort(a))

排序演算法 氣泡排序,歸併排序,快速排序

氣泡排序 屬於交換排序的一種。很好理解的交換排序是這樣的 for int i 0 i n i for int j i 1 j n j 這個演算法的邏輯是從頭到尾掃瞄元素,將這個元素和它後面的所有元素進行比較,如果有比它更小的,那就交換,最後交換的一定是最小的,然後元素指標i後移,再比較它後邊的所有元...

排序演算法三歸併排序

歸併排序 merge sort 是利用歸併的思想實現的排序方法,該演算法採用經典的分治 divide and conquer 策略 分治法將問題分 divide 成一些小的問題然後遞迴求解,而治 conquer 的階段則將分的階段得到的各答案 修補 在一起,即分而治之 遞迴 實現 void merg...

排序演算法 氣泡排序 快排 歸併排序

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。步驟 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同...