選擇、冒泡、插入排序算法總結

本文作的排序都是默認升序排序,即從小到大,此爲大前提數組

----------------------------------------------------------------------------------------------------------------------------------------------------------------spa

l = [2, 5, 3, 6, 1, 4, 0, 9, 18, 11, 15, 12]

# 選擇排序:依次拿一個元素(從第二個元素開始)和第一個位置元素比較,
# 若是比第一個元素小就交換位置,這樣第一次循環結束,最小的數就放在了第一個,以此類推
# 第一層循環肯定元素要放的位置,因此i的取值範圍是數組長度減1,由於最後一個不用比較了,確定是最大的,
# 第二層循環控制每次的循環次數,因此j的取值範圍是i+1到數組的最後一個即len(l)
for i in range(len(l) - 1):
    for j in range(i+1, len(l)):
        if l[i] > l[j]:
            l[i], l[j] = l[j], l[i]
print(l)

 

# 冒泡排序:相鄰的兩個元素比較,後一個元素比前一個元素小,兩個元素互換位置,
# 那麼第一次循環結束,最大元素就到了數組的最後一個位置,以此類推
# 第一層i肯定總循環次數,總循環次數爲數組長度減一,
# 例:只有一個元素的數組,是不用比較的,即比較次數爲0,兩個元素的數組,只需比較一次,比較次數=數組長度-1,以此類推
# 第二層j,控制每次循環比較的次數,比較次數是遞減的,大循環(i)每執行一次,就少一個須要比較的值,因此j的取值範圍是len(l)-i-1

for i in range(len(l)-1):
    for j in range( len(l)-i-1):
        if l[j] > l[j+1]:
            l[j], l[j+1] = l[j+1], l[j]
print(l)

 # 插入排序:數組能夠分爲兩部分,一部分是有序數組,另外一部分是無序數組,從無序數組裏依次取值,跟有序數組比較插入# i表明從無序數組取到值的下標,j表明有序數組裏值的下標# i從第二個元素開始即下標起始值是1,因此i的取值範圍是從數組的第二個值的下標(1)到數組的最後一個值的下標,code

# 第一個元素看做是有序數組的第一個元素即j的起始值, # j的起始值都是從i-1開始,依次遞減,到0 for i in range(1, len(l)): x = l[i] # x表明未排序的值 j=i-1 for j in range(j, -2, -1): # j標記的是當前位置的值的下標 #j表明的是有序(默認升序)數組裏的下標 if l[j] > x: # 若是有序數組裏的最大值比未排序的值大,那麼未排序的值就該往有序數組裏插入,不然退出本次循環 l[j+1] = l[j] # 把有序數組的最大值的下標改成未排序值的下標,此時,未排序值就被摘出來了,由於未排序值的下標和已排序的最大值的下標對應的值是同樣的,都是已排序數組的最大值
# 即把有序數組的最大值日後挪了一位,此時,下標爲j和j+1指向的兩個值是同樣的
else: break # 若是第一次循環就執行到這裏,此時j=i-1, 及j的值指向有序數組的最大值,那麼下面那行代碼不過是自己的值賦給原本的下標了 l[j+1] = x # 若是是最後一次,那麼就是當前循環(i)找到的最小值,插入到下標爲0(由於循環正常結束,j的值是-1)的地方 # 若是是中間次數,那麼l[j]>x不成立,退出本次循環,此時,j已指向前一個值,好比上次循環j的值爲3,那麼下標3和4的值是同樣的, # 由於3的值被賦給了4,那麼本次循環j的值是2,因此j+1指向3,該值就插到了3的位置上,即比2的值大而且比4的值小
  
print(l)
相關文章
相關標籤/搜索