氣泡排序是一種穩定的排序演算法,及相同元素排序前後位置不發生調換,時間複雜度為o(n^2).
氣泡排序的核心思想如下:
依次比較相鄰元素,若前者大於後者則交換位置後繼續向後比較,若小於則直接繼續向後比較
比如:對於ll=[8, 5, 4, 6]
首先比較8和5,8大於5,交換位置,繼續向後比較;由於位置交換,比較8和4,8大於4,交換位置,繼續向後比較;由於交換位置,比較8和6,8大於6,交換位置,比較到最後乙個元素,第一輪比較結束,總共比較了3次,即len(ll)-1次,此時ll=[ 5, 4, 6, 8]
,可以看出第一輪找出了最大的元素,並放在了列表最後。
首先比較5和4,5大於4,交換位置,繼續向後比較;由於位置交換,比較5和6,2小於6,直接繼續向後比較;比較6和8,6小於8,不做交換。這裡可以發現,第一輪已經找出了最大元素8,無需在用6和8比較,所以比較的次數應該減去比較的輪數,即len(ll)-1-1次,2次。此時ll=[5, 4, 6,8]
,可以看出第二輪找出了第二大元素,放在倒數第二個位置。
首先比較5和4,5大於4,交換位置,繼續向後比較。6和8位第二大和最大元素,無需比較,此時比較輪數為len(ll)-1-2次,即1次。可以看出第三輪找到了第三大元素,並放在倒數第三的位置上
由上可知,採用雙重迴圈即可完成**的編寫。第一重迴圈保證相鄰元素能兩兩相互比較,第二重迴圈保證比較的次數為len(ll)-1-比較輪數
。
詳細**如下:
#coding = "utf-8"
defbubble_sort
(list):
"""氣泡排序,穩定"""
#倒數第二個元素和最後乙個元素比較後一輪結束
#所以用len(list)-1
for j in
range
(len
(list))
:#每輪比較的個數為len(list)-1在減去排好的個數,即已執行的輪數
for i in
range
(len
(list
)-j-1)
:# 考慮排好序的序列,記錄變換次數,沒變換次數為0,直接返回
count =0if
list
[i]>
list
[i+1]:
list
[i],
list
[i+1]=
list
[i+1],
list
[i] count+=1if
0== count:
return
if __name__ ==
"__main__"
: li =[9
,4,6
,2,7
,8]print
(li)
bubble_sort(li)
print
(li)
插入排序也是一種穩定的排序演算法,時間複雜度為o(n^2)。
插入排序核心思想如下:
將原始序列分為兩部分,左邊為有序序列,右邊為原始序列,遍歷時每次從原始序列挑選乙個元素插入到左邊有序序列的正確位置。
同理:對於ll=[8, 5, 4, 6]
第一次認為第乙個元素8作為原始序列中的有序序列,挑選5與8比較,5小於8,交換位置,5與左邊有序序列比較完畢,此時ll=[5, 8, 4, 6]
,開始下一次插入。
此時認為前兩個元素為有序序列,挑選下乙個元素4進行比較,4比8小,交換位置,再與5比較,4比5小,交換位置,4與左邊的有序序列交換完畢,此時ll=[4, 5, 8, 6]
此時認為前三個元素為有序序列,挑選下乙個元素6進行比較,6比8小,交換位置,繼續比較6和5,6比5大,交換結束。此時遍歷完成,ll=[4, 5, 6, 8]
由上可知採用雙重迴圈即可完成**,第一重迴圈進行元素遍歷,第二重迴圈將遍歷到的元素與左邊有序序列中的元素依次比較,若小於則交換位置,若大於則停止比較,繼續遍歷。
完整**如下:
# coding = 'utf-8'
definsertion_sort
(list):
# 序列長度
n =len(
list
)# 第一重迴圈,遍歷序列元素
for j in
range
(n):
# 記錄有序序列個數
i = j
# 第二重迴圈,依次比較有序序列,初始認為第乙個元素為有序序列
while i >0:
# 若小於則交換位置
iflist
[i]<
list
[i-1]:
list
[i],
list
[i-1]=
list
[i-1],
list
[i] i -=
1# 不小於則停止交換
else
:break
if __name__ ==
"__main__"
: li =[9
,5684,6
,22,2
,7,8
]print
(li)
insertion_sort(li)
print
(li)
選擇排序是一種不穩定的排序演算法,比如5652,交換後5和2的位置對調,導致相同元素位置前後發生變化。時間複雜度為o(n^2)。
選擇排序核心思想如下:
將原始序列分成兩部分,左邊有序,右邊為原始序列,每次尋找右邊序列的最小值,交換至左邊序列的末尾
選擇排序過程比較簡單,直接上**:
def
selection_sort
(list):
#主迴圈進行n-1次,最後乙個數n為最大值,不用迴圈
for j in
range
(len
(list)-
1):#第乙個值的下標最為最小下標
min_index = j
#從第j+1個值開始比較,若不是最小,則交換下標
for i in
range
(j+1
,len
(list))
:iflist
[min_index]
>
list
[i]:
min_index = i
#自迴圈執行完一輪後,此時i為列表中最小值下標,將值交換
python語言實現氣泡排序(13)
首先介紹氣泡排序演算法 重複地遍歷要排序的數列,一次比較兩個元素,如果他們順序錯誤就交換 從小到大 演算法流程 1.比較相鄰的元素,如果第乙個比第二個大,交換兩者。2.對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。這步做完,最後的元素是最大元素。3.針對所有元素重複以上步驟,除了最後乙...
氣泡排序 c語言實現
氣泡排序 排序思想 1.對於乙個長度為n的陣列,進行n 1次迴圈 2.第一次次迴圈中,先將1和2元素比較,如果元素1比元素2大,則交換其位置,接著比較元素2和元素3,以此類推,最終最大的元素排在最後一位 3.接著第二次迴圈,要排序的元素個數減少乙個 最大的已經放在最後一位 重複2的過程 4.這樣,每...
C語言實現氣泡排序
氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從...