它重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從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...