標題冒泡排序:原理就是重複的進行 兩兩 元素之間的比較(冒泡的意思就是左右之間的比較元素)
注意錯誤點 IndexError: list index out of range (列表索引超出範圍)
冒泡循環 典型的2層 for 循環 ,for1(最外層) 和 for2(內層循環)。
在冒泡循環中 外層for1 循環的次數代表的 是 列表中 所有數 比較的次數。一般情況爲
range(1,len(list1))或者 range(0,len(list1)-1)
在內層循環中 循環次數代表的是 剩餘元素之間 兩兩比較,外層每比較一次,內層就要減少一次,所以
range(0,len(list1)-i) 或者 range(0,len(list1)-i-1)
range()不論內外層 都要做 減一的排序,因爲兩兩 比較最後一個元素 是不用再去比較的
從下面的例子可以看出 range(1,len(list1))與range(0,len(list1)-i) 是一對 for1 for2循環
range(0,len(list1)-i-1)與 range(0,len(list1)-i-1) 也是一對for1(外層) for2(內層)循環
標題冒泡循環的時間複雜度 是 N2
#例子1
sum1= 0 #比較次數
list1 = [4, 4, 5, 6, 7, 8, 3, 5,9]
for i in range(1, len(list1)): # 注意這裏的起始下標爲從一開始
for j in range(0, len(list1) - i): # 最後一個自己不用和自己比較所以,可以少一次
sum1 +=1
if list1[j] > list1[j + 1]:
list1[j], list1[j + 1] = list1[j + 1], list1[j]
print(list1)
print(sum1)
#例子2
sum = 0
list2 = [45, 4, 6, 5, 9, 7, 8, 3, 45]
for i in range(0, len(list2) - 1): # 最後一個自己不用和自己比較所以,可以少一次
for j in range(0, len(list2) - i - 1): # 每執行一次將本次循環中最大的元素放入對應末尾,所以減去i,少執行對應次數
sum += 1
if list2[j] > list2[j + 1]:
list2[j], list2[j + 1] = list2[j + 1], list2[j]
print(list2)
print(sum)