排序算法-冒泡排序
冒泡排序是一種簡單的排序算法。
它重復地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。
走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。
這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。(相鄰對比交換位置)# 基礎版本
def bubble_sort(data_list):length = len(data_list)for i in range(length):for j in range(length-1-i):if data_list[j] > data_list[j+1]:data_list[j], data_list[j+1] = data_list[j + 1], data_list[j]return data_list# 優化1
def bubble_sort_1(data_list):"""如果沒有元素交換,說明排序過程已經有序,直接退出循環"""length = len(data_list)for i in range(length):swap = Falsefor j in range(length-1-i):if data_list[j] > data_list[j+1]:swap = Truedata_list[j], data_list[j+1] = data_list[j + 1], data_list[j]if not swap:breakreturn data_list# 優化2
def bubble_sort_2(data_list):"""排序過程中,數據中間分成兩段,一段是無序狀態,另一段是有序狀態,每一次循環過程中,記錄最后一次交換元素的位置,這個位置是有序和無序的邊界下一次循環到邊界即可,從而減少循環次數"""length = len(data_list)boarder = length - 1last_index = 0for i in range(length):swap = Falsefor j in range(boarder):if data_list[j] > data_list[j+1]:swap = Truedata_list[j], data_list[j+1] = data_list[j + 1], data_list[j]last_index = jif not swap:breakboarder = last_indexreturn data_listunsort = [3, 4, 2, 1, 5, 6, 7, 8]
print(bubble_sort(unsort))
print(bubble_sort_1(unsort))
print(bubble_sort_2(unsort))冒泡排序算法的性能分析: 1、執行效率最小時間復雜度:很好計算,最好的情況就是數據一開始就是有序的,因此一次冒泡即可完成, 時間復雜度為 O(n)最大時間復雜度:也很好計算,最壞的情況就是數據一開始就是倒序的,因此進行 n-1 次冒泡即可完成,時間復雜度為 O(n^2)2、內存消耗算法的內存消耗可以通過空間復雜度來衡量,冒泡排序僅需要一個變量 tmp 來儲存交換的數據,
因此空間復雜度為 O(1),空間復雜度為 O(1) 的排序算法,也叫 原地排序算法3、排序算法的穩定性針對排序算法,有一個重要的衡量指標,就是穩定性,這個概念是說,如果待排序的序列中存在 值相等的元素,經過排序之后,相等元素之間原有的先后順序不變。假如有序列 4,1,2,2,我 們把第一個 2 叫 2',第二個2 叫 2'',如果排序之后,為1,2',2'',4 那么這個排序算法就是穩定的,否則就是不穩定的。穩不穩定有什么用嗎,值都是一樣的?當然有用,因為在軟件開發中, 要排序的數據不單單是一個屬性的數據,
而是有多個屬性的對象,假如對訂單排序,要求金額排 序,訂單金額相同的情況下,按時間排序。
最先想到的方法就是先對金額排序,在金額相同的訂 單區間內按時間排序,理解起來不難,有沒有想過,實現起來很復雜。
但是借助穩定的排序算法,就很簡單了,先按訂單時間排一次序,再按金額排一次序就可以了
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
- 上一篇: 80. Leetcode 1642. 可
- 下一篇: 排序算法-插入排序