排序 冒泡 選擇 插入

2021-10-25 14:41:17 字數 3594 閱讀 3961

氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。

1. 比較相鄰的元素。如果第乙個比第二個大,就交換它們兩個;

2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對,這樣在最後的元素應該會是最大的數;

3. 針對所有的元素重複以上的步驟,除了最後乙個;

4. 重複步驟1~3,直到排序完成。

def

bubble_sort

(arrlist):​

# 如果列表長度是0,1,則不用排序

iflen

(arrlist)

<2:

return​​

n =len(arrlist)

for j in

range

(n-1,0

,-1)

:for i in

range

(j):

# 從列表的下標為0開始比較,比較0-1,1-2,。。。一直比較到i-i+1

# 如果前面的數比後面的數大,就把前面的數換到後面來

if arrlist[i]

> arrlist[i+1]

: arrlist[i]

,arrlist[i+1]

= arrlist[i+1]

,arrlist[i]

​if __name__ ==

"__main__"

: li =[54

,26,93

,17,77

,31,44

,55,20

]print

(li)

bubble_sort(li)

print

(li)

最優時間複雜度:o(n) (表示遍歷一次發現沒有任何可以交換的元素,排序結束。)

最壞時間複雜度:o(n^2)

穩定性:穩定

選擇排序(selection sort)是一種簡單直觀的排序演算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

選擇排序動作有點和氣泡排序是相逆的,選擇排序是將最小的放在元素最前面,氣泡排序是將最大的放在最後面。

選擇排序的主要優點與資料移動有關。如果某個元素位於正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當中至少有乙個將被移到其最終位置上,因此對n個元素的表進行排序總共進行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序屬於非常好的一種。

n個記錄的直接選擇排序可經過n-1趟直接選擇排序得到有序結果。具體演算法描述如下:

設第乙個元素為比較元素,依次和後面的元素比較,比較完所有元素找到最小的元素,將它和第乙個元素互換

重複上述操作,我們找出第二小的元素和第二個位置的元素互換,以此類推找出剩餘最小元素將它換到前面,即完成排序

def

selection_sort

(alist)

: n =

len(alist)

# 需要進行n-1次選擇操作

for i in

range

(n-1):

# 記錄最小位置

min_index = i

# 從i+1位置到末尾選擇出最小資料

for j in

range

(i+1

, n)

:if alist[j]

< alist[min_index]

: min_index = j

# 如果選擇出的資料不在左邊的位置,進行交換

if min_index != i:

alist[i]

, alist[min_index]

= alist[min_index]

, alist[i]

最優時間複雜度:o(n^2)

最壞時間複雜度:o(n^2)

穩定性:不穩定(考慮公升序每次選擇最大的情況)

表現最穩定的排序演算法之一,因為無論什麼資料進去都是o(n2)的時間複雜度,

所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。

理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。

插入排序(英語:insertion sort)是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

一般來說,插入排序都採用in-place在陣列上實現。具體演算法描述如下:

從第乙個元素開始,該元素可以認為已經被排序;

取出下乙個元素,在已經排序的元素序列中從後向前掃瞄;

如果該元素(已排序)大於新元素,將該元素移到下一位置;

重複步驟3,直到找到已排序的元素小於或者等於新元素的位置;

將新元素插入到該位置後;

重複步驟2~5。

def

insert_sort

(alist)

:"""插入排序"""

n =len(alist)

# 從右邊的無序序列中取出多少個元素執行這樣的過程

for j in

range(1

, n)

:# j = [1, 2, 3, n-1]

# i 代表內層迴圈起始值

i = j

# 執行從右邊的無序序列中取出第乙個元素,即i位置的元素,然後將其插入到前面的正確位置中

while i >0:

if alist[i]

< alist[i-1]

: alist[i]

, alist[i-1]

= alist[i-1]

, alist[i]

i -=

1else

:break

最優時間複雜度:o(n) (公升序排列,序列已經處於公升序狀態)

最壞時間複雜度:o(n^2)

穩定性:穩定

插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),

因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

選擇 插入 氣泡排序

選擇 插入 氣泡排序 說明 選擇排序 selection sort 插入排序 insertion sort 與氣泡排序 bubble sort 這三個排序方式是初學排序所必須知道的三個基本排序方式,它們由於速度不快而不實用 平均與最快的時間複雜度都是o n2 然而它們排序的方式確是值得觀察與 的。解...

排序 冒泡 選擇 插入

三種簡單排序 時間複雜度 o n 空間複雜度 o 1 氣泡排序的基本思想是通過比較兩個相鄰的記錄之間的比較和交換,使關鍵碼比較小的繼續逐漸從底部移向頂部 上公升 關鍵碼比較大的逐漸從頂部移向底部 沉底 冒泡由此得名。演算法思想 設有a 1 a n 的n個資料,氣泡排序的過程可以描述為 1 首先將相鄰...

選擇 插入 氣泡排序

size medium 選擇排序 將要排序的物件分作兩部份,乙個是已排序的,乙個是未排序的,從後端未排序部份選擇乙個最小值,並放入前端已排序部份的最後乙個,例如 排序前 70 80 31 37 10 1 48 60 33 80 1.1 80 31 37 10 70 48 60 33 80 選出最小值...