實現從小到大排序
實現原理:
每次: 依此從前兩個數開始比較,交換位置,大的數在後面,
第一輪,比較n 次,前n-1個數不管,第n個數肯定是最大的
第二輪,比較n-1次,第n-1個數肯定是第二大的,
…以此類推
第1次 j=0 i 走n次 range(0,n-1)
第2次 j=1 i比較 n-1次 range(0,n-2)
j控制需要走多少輪,i控制每輪需要比較的次數
為什麼叫冒泡:
小的在前面,大的在最後面
**時間複雜度:
最差: n+n-1+n-2 +…+1=o(n^2)
最優:本來就是有序,第一輪過後不再進行比較,一次遍歷 o(n)
輪次如何控制?
有兩種方式:
1. 外層迴圈j從 0到 len-1 共要執行n次
內層迴圈:
j=0 第1次時 i需要比較 len-1次
j=1 第2次時 i需要比較 len-2次
…所以 i+j=len-1
程式實現為:
for j in
range(0
,length -1)
:# 產生的j是:[0,1,2 ...n-2]
for i in
range(0
, length - j -1)
:
2.j倒序輪次數,i直接每次取j的值作為比較次數
j從length-1開始,每次倒序減少1,直到1
i第一次比較 length-1次
程式實現為:
for j in
range
(length-1,
0,-1
):# 產生的j是:[n-1,n-2,...1]
for i in
range
(j):
如何優化最優的情況,避免已經有序還要接著遍歷比較?
加入計數,初始值為0
如果有出現 a[i]>a[i+1] 時,count就加1
i for迴圈一次後,即順序遍歷一遍後,沒有出現 a[i]>a[i+1] ,則說明全部都是有序,直接break 或者return 即可
"""
defbubble_sort
(num_list)
:# j控制走的次數
length =
len(num_list)
for j in
range(0
,length -1)
:# 產生的j是:[0,1,2 ...n-2]
count=
0for i in
range(0
, length - j -1)
:# 游標從頭走到尾部
if num_list[i]
> num_list[i +1]
: num_list[i]
, num_list[i +1]
= num_list[i +1]
, num_list[i]
count=count+
1if count==0:
break
defbubble_sort_2
(num_list)
:# j控制走的次數
length =
len(num_list)
for j in
range
(length-1,
0,-1
):# 產生的j是:[n-1,n-2,...1]
for i in
range
(j):
# 游標從頭走到尾部
if num_list[i]
> num_list[i +1]
: num_list[i]
, num_list[i +1]
= num_list[i +1]
, num_list[i]
if __name__ ==
"__main__"
:list=[
2,1,
8,7,
9,5]
print
(list
) bubble_sort(
list
)print
(list
)
資料結構 氣泡排序
起泡排序的過程很簡單。首先將第乙個記錄的關鍵字和第二個記錄的關鍵字進行比較,若為逆序,則將兩個記錄交換之,然後比較第二個記錄和第三個記錄的關鍵字。依次類推,直至第n 1個記錄和第n個記錄的關鍵字進行比較為止。上述過程稱作第一趟起泡排序,其結果使得關鍵字最大的記錄被安置到最後乙個記錄的位置上。然後進行...
資料結構 氣泡排序
氣泡排序演算法的基本思想是 假設待排序表長為n,從後往前 或從前往後 兩兩比較相鄰元素的值,若為逆序 即a i 1 a i 則交換它們,直到序列比較完。我們稱它為一趟冒泡,如果將最小的元素交換到待排序序列的第乙個位置 關鍵字小的元素往上 漂浮 這就是氣泡排序名字的由來 下一趟冒泡時,前一趟確定的最小...
資料結構 氣泡排序
目標效果 原始碼 include void print out int a,int n void bubble sort int a,int n int main printf 起泡排序 n printf 排序前 n printresult a,10 排序方法 bubblesort a,10 pri...