本文做的排序都是預設公升序排序,即從小到大,此為大前提
l = [2, 5, 3, 6, 1, 4, 0, 9, 18, 11, 15, 12]#選擇排序:依次拿乙個元素(從第二個元素開始)和第乙個位置元素比較,
#如果比第乙個元素小就交換位置,這樣第一次迴圈結束,最小的數就放在了第乙個,以此類推
#第一層迴圈確定元素要放的位置,所以i的取值範圍是陣列長度減1,因為最後乙個不用比較了,肯定是最大的,
#第二層迴圈控制每次的迴圈次數,要從i+1個元素開始與第i個元素比較,所以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)到陣列的最後乙個值的下標,
#第乙個元素看作是有序陣列的第乙個元素即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)
冒泡,選擇,插入排序演算法 總結
之前一直都沒有怎麼注意簡單演算法的編寫,現在重寫翻閱了下資料,才慢慢熟悉。package com.klay.sort public class klay int arr1 int arr2 bubbo arr for int i 0 i arr.length i system.out.println...
冒泡 選擇 插入排序演算法
1.氣泡排序 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數 也就是第一波冒泡完成 針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。...
排序演算法 冒泡 選擇 插入排序
本文簡單總結一下三大排序演算法,如有不足,請多多提意見。簡述 從小到大排序,每次比較兩個元素,看他們的順序有沒有錯,如果錯了就換過來。a 比較abc.元素,如果第乙個比第二個大,則將兩個元素交換位置 bac.再依次將a和c進行比較。b 對每一對相鄰的元素做同樣的工作,從第一對到最後一對。這一次執行完...