資料結構與演算法 氣泡排序

2021-09-27 23:59:49 字數 2766 閱讀 7653

它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從a到z)錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。

原理:

比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。

對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。

針對所有的元素重複以上的步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

例如:

有乙個無序數列:3, 6, 5, 8, 4, 2, 7, 9, 1, 希望從小到大排序。

第一輪:(3, 6, 5, 8, 4, 2, 7, 9, 1)

3與6比較,3<6,元素位置不變;3, 6, 5, 8, 4, 2, 7, 9, 1

6與5比較,6>5,元素6和5交換位置;3, 5, 6 , 8, 4, 2, 7, 9, 1

6與8比較,6<8,元素位置不變;3, 5, 6 , 8, 4, 2, 7, 9, 1

8與4比較,8>4,元素8和4交換位置;3, 5, 6 , 4, 8, 2, 7, 9, 1

8與2比較,8>2,元素8和2交換位置;3, 5, 6 , 4, 2, 8, 7, 9, 1

8與7比較,8>7,元素8和4交換位置;3, 5, 6 , 4, 2, 7, 8, 9, 1

8與9比較,8<9,元素位置不變;3, 5, 6 , 4, 2, 7, 8, 9, 1

9與1比較,9>1,元素9和1交換位置;3, 5, 6 , 4, 2, 7, 8, 1, 9

此時,元素9作為數列最大元素,移動到了最右側;

第二輪:(3, 5, 6 , 4, 2, 7, 8, 1, 9)

3與5比較,3<5,元素位置不變;3, 5, 6 , 4, 2, 7, 8, 1, 9

5與6比較,5<6,元素位置不變;3, 5, 6 , 4, 2, 7, 8, 1, 9

6與4比較,6>4,元素6和4交換位置;3, 5, 4 , 6, 2, 7, 8, 1, 9

6與2比較,6>2,元素6和2交換位置;3, 5, 4 , 2, 6, 7, 8, 1, 9

6與7比較,6<7,元素位置不變;3, 5, 4 , 2, 6, 7, 8, 1, 9

7與8比較,7<8,元素位置不變;3, 5, 4 , 2, 6, 7, 8, 1, 9

8與1比較,8>1,元素8和1交換位置;3, 5, 4 , 2, 6, 7, 1, 8, 9

此時,8和9都是有序的;

第三輪:(3, 5, 4 , 2, 6, 7, 1, 8, 9)

按照上面操作,結果是3, 4, 2 , 5, 6, 1, 7, 8, 9

此時,7,8,9是有序的;

第四輪:(3, 4, 2 , 5, 6, 1, 7, 8, 9)

交換後,結果是3, 2, 4 , 5, 1, 6, 7, 8, 9

此時,6,7,8,9是有序的

第五輪:(3, 2, 4 , 5, 1, 6, 7, 8, 9)

交換後,結果是2, 3, 4 , 1, 5, 6, 7, 8, 9

此時,5,6,7,8,9是有序的

第六輪:(2, 3, 4 , 1, 5, 6, 7, 8, 9)

交換後,結果是2, 3, 1 , 4, 5, 6, 7, 8, 9

此時,4,5,6,7,8,9是有序的

第七輪:(2, 3, 1 , 4, 5, 6, 7, 8, 9)

交換後,結果是2, 1, 3 , 4, 5, 6, 7, 8, 9

此時,3,4,5,6,7,8,9是有序的

第八輪:(2, 1, 3 , 4, 5, 6, 7, 8, 9)

交換後,結果是1, 2, 3 , 4, 5, 6, 7, 8, 9

此時,所有元素都有序。時間複雜度(o(n^2)

**:

def bubble_sort(nums):

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

for j in range(len(nums) - i - 1):

if nums[j] > nums[j + 1]:

nums[j], nums[j + 1] = nums[j + 1], nums[j]

return nums

優化:

若數列提前有序,及時結束;

每一輪排序的最後,記錄下最後一次元素交換的位置,那個位置也是無序數列的邊界,再往後就是有序區;

def bubble_sort(nums):

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

ex_flag = false # 設定乙個交換標誌位

for j in range(len(nums) - i - 1):

if nums[j] > nums[j + 1]:

nums[j], nums[j + 1] = nums[j + 1], nums[j]

ex_flag = true

if not ex_flag:

return nums

return nums

資料結構與演算法 排序 氣泡排序

兩兩相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。氣泡排序基本概念是 依次比較相鄰的兩個數,將小數放在前面,大數放在後面。即在第一趟 首先比較第1個和第2個數,將小數放前,大數放後。然後比較第2個數和第3個數,將小數放前,大數放後,如此繼續,直至比較最後兩個數,將小數放前,大數放後。至此...

資料結構與演算法 排序 氣泡排序

今天來學一下十大排序 首先,我們先了解下各個排序的時間複雜度 冒泡 選擇 插入 歸併 快速 希爾 堆排序屬於比較排序 在這裡,我們預設排序是從小到大排序。乙個動態演示各種排序演算法的動畫 visualgo 如果相等的兩個元素,在排序前後的相對位置保持不變,那麼這個演算法是穩定的排序演算法。比如 5 ...

資料結構與演算法 氣泡排序

氣泡排序的思想是,從前往後 或從後往前 掃瞄,每找乙個逆序對,就將它更正過來,這樣每一輪總可以找到乙個最大值或最小值。1 從前往後掃瞄,每次找到的較大值插入到後面,第一層迴圈代表當前插入位置。public static void sinksort int nums,int start,int end...