氣泡排序是一種交換排序
比較相鄰的連個關鍵字,把大的往後放,小的就向前移動,即冒泡
def bubblesort(input_list):
#如果待排序列為空,則直接返回空列表
if len(input_list) == 0:
return
sorted_list = input_list
for i in range(len(input_list)-1):
for j in range(len(input_list)-1):
#發現後面元素小於前面元素,則交換該兩個元素
若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所需的關鍵字比較次數c和記錄移動次數m均達到最小值:cmin = n - 1, mmin = 0。所以,氣泡排序最好時間複雜度為o(n)。
但是上述**,不能掃瞄一趟就完成排序,它會進行全掃瞄。所以乙個改進的方法就是,當冒泡中途發現已經為正序了,便無需繼續比對下去。改進方法一會兒介紹。
若初始檔案是反序的,需要進行 n -1 趟排序。每趟排序要進行 n - i 次關鍵字的比較(1 ≤ i ≤ n - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:
cmax = n(n-1)/2 = o(n^2)
mmax = 3n(n-1)/2 = o(n^2)
氣泡排序的最壞時間複雜度為o(n^2)。
因此,氣泡排序的平均時間複雜度為o(n^2)。
總結起來,其實就是一句話:當資料越接近正序時,氣泡排序效能越好。
在後面元素小於前面元素才發生交換,故相等時是不交換的,所以氣泡排序是一種穩定排序演算法
對氣泡排序常見的改進方法是加入flag變數,用於記錄某一趟排序過程中是否有資料交換。
如果進行某一趟排序時並沒有進行資料交換,則說明所有資料已經有序,可立即結束排序,避免不必要的比較過程。
**:def bubblesort(input_list):
#如果待排序列為空,則直接返回空列表
if len(input_list) == 0:
return
sorted_list = input_list
for i in range(len(input_list)-1):
#加入標誌變數,初始值設為false
flag = false
for j in range(len(input_list)-1):
#發現後面元素小於前面元素,則交換該兩個元素
if sorted_list[j+1]結果:少兩趟,比之前優化
input_list:
[50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
1th:
[50, 123, 187, 49, 30, 0, 2, 11, 100, 543]
2th:
[50, 123, 49, 30, 0, 2, 11, 100, 187, 543]
3th:
[50, 49, 30, 0, 2, 11, 100, 123, 187, 543]
4th:
[49, 30, 0, 2, 11, 50, 100, 123, 187, 543]
5th:
[30, 0, 2, 11, 49, 50, 100, 123, 187, 543]
6th:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
7th:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
sorted_list:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
Python排序演算法之氣泡排序
顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快 對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 mylist 1,4,5,0,6 比較方式為 相鄰的兩個數字先進行比較,也就是mylist 0 和mylist 1 發現不是 的關係,就繼續比較mylist 1 和mylist 2 依次進行...
排序演算法(python) 之 氣泡排序
比較相鄰的兩個元素,若前乙個大於後乙個則交換 對每一對相鄰元素進行比較,直至最後一對元素。重複上述步驟,知道排序完成。這為向上冒泡。向下冒泡同理。1 向上冒泡 m input split n int m i for i in range len m 輸入的陣列 for i in range len ...
Python排序演算法之氣泡排序
比較列表相鄰的兩個值,如果前面比後面大,則交換這兩個值。每一趟氣泡排序,無序區減少乙個數,有序區增加乙個數。最壞情況 o n 2n 2 n2 平均情況 o n 2n 2 n2 最好情況 o n o 1 穩定 簡單 趟數 n 1 無序區範圍 0 n 趟數 1 在一趟氣泡排序完成後,如果沒有發生任何的交...