資料結構(5) 氣泡排序

2021-09-29 21:56:56 字數 2307 閱讀 9278

實現從小到大排序

實現原理:

每次: 依此從前兩個數開始比較,交換位置,大的數在後面,

第一輪,比較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...