2)優化版
穩定性:如果乙個排序演算法是穩定的,當有兩個相等鍵值的記錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是在s之前
比如:假設以下的數對將要以他們的第乙個數字來排序
(4,1) (3,1) (3,7) (5,6)
在這個狀況下,有可能產生兩種不同的結果,乙個是讓相等鍵值的記錄維持相對的次序,另乙個則沒有
維持次序:(3,1)(3,7)(4,1)(5,6)
次序被改變:(3,7)(3,1)(4,1)(5,6)
即,(3,1) 原來就在(3,7)之前,排序後(3,1)始終都在(3,7)之前為穩定的排序演算法
我們比較的是3,無關於後面的7和1,如果排序後(3,1)和(3,7)順序改變,則為不穩定演算法
是一種簡單的排序演算法
氣泡排序演算法的步驟:
交換過程圖示(第一次):
那麼我們需要進行n-1次冒泡過程,直到所有的元素都輪一次
兩次遍歷中:
第一次為判斷每個值與其他值的大小的迴圈;
第二次為當前值與其他值的比較的迴圈。
第二次在第一次的基礎下,第一次迴圈到哪個數時,第二次的次數就是這個數之前的個數-1
def
bubble_sort
(alist)
: n=
len(alist)
# 共要排列多少次
for i in
range
(n-1):
# 班長從投走到尾,一次排列的迴圈
for j in
range
(n-1
-i):
if alist[j]
>alist[j+1]
: alist[j]
,alist[j+1]
=alist[j+1]
,alist[j]
if __name__ ==
'__main__'
:list=[
44,54,
73,23,
1,2,
53,67,
88,32,
21]print
(list
) bubble_sort(
list
)print
(list
)
結果:
[44,
54,73,
23,1,
2,53,
67,88,
32,21]
[1,2
,21,23
,32,44
,53,54
,67,73
,88]
時間複雜度import time
defbubble_sort
(alist)
: n=
len(alist)
# 共要排列多少次
for i in
range
(n-1):
# 班長從投走到尾,一次排列的迴圈
count=
0for j in
range
(n-1
-i):
if alist[j]
>alist[j+1]
: alist[j]
,alist[j+1]
=alist[j+1]
,alist[j]
count +=1if
0== count:
# 新增乙個count,需要交換時,也就是兩個數的順序不滿足條件時,+1
# 當count為0時表示前面的元素都是滿足順序的,沒有經過交換
# 因此在後續的迴圈中不再需要作比較
return
if __name__ ==
'__main__'
:list=[
44,54,
73,23,
1,2,
53,67,
88,32,
21]print
(list
) bubble_sort(
list
)print
(list
)
結果:
[44,
54,73,
23,1,
2,53,
67,88,
32,21]
[1,2
,21,23
,32,44
,53,54
,67,73
,88]
時間複雜度
此時,如果出現最優複雜度的序列時,就不會再按照**每個元素都遍歷
資料結構 知識點
定義 度 兒子數 分支節點 除了根和葉子的節點 根的深度為1 資料結構的分類 資料結構分為邏輯結構和物理結構。邏輯結構 表現資料之間的關係的一種資料結構,分為線性結構和非線性結構。物理結構 表現資料如何儲存的一種資料結構,通常分為順序結構 鏈式結構 索引結構和雜湊結構。有序表,也叫有序線性表,資料按...
資料結構知識點
1 線性結構與非線性結構 線性結構 線性表,棧,隊 乙個根節點,最多乙個前節點乙個後節點 首節點無前節點,尾接點無後節點 非線性結構 樹形結構,圖形結構 線性表 由一組資料元素構成,資料元素的位置只取決於自己的序號 陣列 棧 限定只能在表的一端進行插入和刪除,先進後出,只能在棧頂進出 佇列 只能在表...
資料結構,知識點
二叉樹 定義 二叉樹在圖論中是這樣定義的 二叉樹是乙個連通的無環圖,並且每乙個頂點的度不大於3。有根二叉樹還要滿足根節點的度不大於2。基本概念 二叉樹是遞迴定義的,其結點有左右之分,邏輯上二叉樹有五種基本形態 1 空二叉樹 2 只有乙個根節點的二叉樹 3 只有左子樹 4 只有右子樹 5 完全二叉樹。...