氣泡排序 二分法

2022-04-28 15:12:14 字數 3107 閱讀 9096

核心:掐頭去尾取中間. 一次砍一半

二分查詢. 每次能夠排除掉一半的資料. 查詢的效率非常高. 但是侷限性比較大. 必須是有

序序列才可以使用二分查詢

兩種演算法: 常規迴圈, 遞迴迴圈

#

使用二分法可以提高效率, 前提條件:有序序列

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]

n = 88left =0

right = len(lst)-1

while left <= right: #

邊界, 當右邊比左邊還小的時候退出迴圈

mid = (left + right)//2 #

必須是整除. 因為索引沒有小數

if lst[mid] >n:

right = mid - 1

if lst[mid] left = mid + 1

if lst[mid] ==n:

print("

找到了這個數")

break

else

:

print("

沒有這個數

")

遞迴來完成二分法

lst = [22, 33, 44, 55, 66, 77, 88, 99, 101 , 238 , 345 , 456 , 567 , 678 , 789]

deffunc(n, left, right):

if left <= right: #

邊界print("哈哈"

) # 計算查詢了幾次

mid = (left + right)//2

if n >lst[mid]:

left = mid + 1

return func(n, left, right) #

遞迴 遞迴的入口

elif n right = mid - 1

#深坑. 函式的返回值返回給呼叫者

return func(n, left, right) #

遞迴elif n ==lst[mid]:

print("

找到了"

)

return

mid

#return # 通過return返回. 終止遞迴

else

:

print("

沒有這個數

") #

遞迴的出口

return -1 #

1, 索引+ 2, 什麼都不返回, none

#找66, 左邊界:0, 右邊界是:len(lst) - 1

ret = func(70, 0, len(lst) - 1)

print(ret) #

不是none

#

時間複雜度最低, 空間複雜度最低, 只需找一次,缺點也明顯

lst1 = [5,6,7,8]

lst2 =[0,0,0,0,0,0,0,0,0]

for el in

lst1:

lst2[el] = 1

if lst2[4] == 1: #

o(1)

print('

找到了')

else

:

print("

沒找到")

顧名思義,氣泡排序直觀的意思是氣泡越大冒的越快:),對應到我們的列表中就是數字最大的先選出來,然後依次進行。例如 mylist = [1,4,5,0,6],比較方式為:

相鄰的兩個數字先進行比較,也就是mylist[0]和mylist[1],發現不是">"的關係,就繼續比較mylist[1]和mylist[2]。。。依次進行,發現mylist[2]>mylist[3](及5>0),就進行交換,所以走完第一次全列表比較得到新列表[1,4,0,5,6],然後每一次掃瞄得到的新列表如下:

第一次:[1,4,0,5,6]

第二次:[1,0,4,5,6]

第三次:[0,1,4,5,6]

第四次:[1,4,5,0,6]

1 def

bubblesort(mylist):

2 #

首先獲取list的總長度,為之後的迴圈比較作準備

3 length =len(mylist)

4

5 #

一共進行幾輪列表比較,一共是(length-1)輪

6 for i in range(0,length-1):

7

8 #

每一輪的比較,注意range的變化,這裡需要進行length-1-長的比較,注意-i的意義(可以減少比較已經排好序的元素)

9 for j in range(0,length-1-i):

10

11 #

交換12 if mylist[j] > mylist[j+1]:

13 tmp =mylist[j]

14 mylist[j]=mylist[j+1]

15 mylist[j+1] =tmp

16

17 #

列印每一輪交換後的列表

18 for item in

mylist:

19 print

(item)

20 print("

*************************====")

21 22 print("

bubble sort: ")

23 mylist = [1,4,5,0,6]

24 bubblesort(mylist)

二分法和氣泡排序

先放乙個 可以看到冒泡,選擇,插入排序的過程 冒泡 選擇 插入排序 前言 二分法是乙個優化演算法,在乙個基於有序列表中,列表從1到10000,如果要找乙個8899的數字,不用二分法的話,就是迴圈從一到10000,直到找到8899.但是,有沒有想過,前5000個都比8899小,所以能不能直接第一次就判...

氣泡排序,二分法查詢

lst 18,8,16,2,5,7 通過交換的方式.把列表中最大的值一定到最右端 for abc in range len lst 控制內部移動的次數 n 0 while n len lst 1 if lst n lst n 1 lst n lst n 1 lst n 1 lst n n n 1 p...

氣泡排序法和二分法排序

使用氣泡排序法對陣列進行排序的原理 陣列元素兩兩比較大小 function func arr print r arr arr array 0,11,2,3,24,5,16,7,48,9 func arr 使用快速排序法對陣列進行排序的原理 陣列元素進行樹狀分支,分結點比較大小,然後採用遞迴函式遞迴處...