Python的排序演算法

2021-10-05 02:23:18 字數 4148 閱讀 2706

一、排序演算法的穩定性

排序演算法的穩定性

穩定性:穩定排序演算法會讓原本有相等鍵值的紀錄維持相對次序。也就是如果乙個排序演算法是穩定的,當有兩個相等鍵值的紀錄r和s,且在原本的列表中r出現在s之前,在排序過的列表中r也將會是在s之前。

當相等的元素是無法分辨的,比如像是整數,穩定性並不是乙個問題。然而,假設以下的數對將要以他們的第乙個數字來排序。

(4, 1) (3, 1) (3, 7)(5, 6)

在這個狀況下,有可能產生兩種不同的結果,乙個是讓相等鍵值的紀錄維持相對的次序,而另外乙個則沒有:

(3, 1) (3, 7) (4, 1) (5, 6) (維持次序)

(3, 7) (3, 1) (4, 1) (5, 6) (次序被改變)

不穩定排序演算法可能會在相等的鍵值中改變紀錄的相對次序,但是穩定排序演算法從來不會如此。不穩定排序演算法可以被特別地實現為穩定。作這件事情的乙個方式是人工擴充鍵值的比較,如此在其他方面相同鍵值的兩個物件間之比較,(比如上面的比較中加入第二個標準:第二個鍵值的大小)就會被決定使用在原先資料次序中的條目,當作乙個同分決賽。然而,要記住這種次序通常牽涉到額外的空間負擔。

二、氣泡排序

氣泡排序:第乙個數逐步與後乙個數進行比較,最大的數到最後乙個位置

第乙個數逐步與後乙個數進行比較,最大的數到倒數第二個位置……

…至此到排序有序

"""方法一"""

defbubble_sort

(alist)

:"""氣泡排序"""

n=len(alist)

for j in

range

(n-1):

#要走多少次

flag=

0for i in

range(0

,n-1

-j):

#從頭走到尾的次數

if alist[i]

> alist[i+1]

: alist[i]

,alist[i+1]

= alist[i+1]

,alist[i]

flag=

1if flag ==0:

return

"""方法二"""

defbubble_sort_2

(alist)

: n =

len(alist)

for j in

range

(n-1,0

,-1)

:for i in

range

(j):

if alist[i]

> alist[i+1]

: alist[i]

,alist[i+1]

= alist[i+1]

,alist[i]

if __name__ ==

"__main__"

: li=[5

,8,2

,3,9

,1]print

(li)

bubble_sort(li)

print

(li)

執行結果:

執行前:[5,

8,2,

3,9,

1]執行後:[1,

2,3,

5,8,

9]

時間複雜度

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

最壞時間複雜度:o(n2)

穩定性:穩定

三、選擇排序

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

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

2.**實現

def

select_sort

(alist)

:"""選擇排序"""

n=len(alist)

for j in

range(0

,n-1):

#j:0~n-2

#j=[0,1,2,3,...,n-2]

min= j

for i in

range

(j+1

, n)

:#從j的後乙個元素進行比較,直到比較最後乙個元素

if alist[

min]

> alist[i]

:min

= i alist[

min]

, alist[j]

= alist[j]

, alist[

min]

if __name__ ==

"__main__"

: li=[5

,8,2

,3,9

,1]print

(li)

select_sort(li)

print

(li)

執行結果:

[5,

8,2,

3,9,

1][1

,2,3

,5,8,9]

時間複雜度

最優時間複雜度:o(n2)

最壞時間複雜度:o(n2)

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

四、插入排序

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

2.**實現

def

insert_sort

(alist)

: n=

len(alist)

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

for j in

range(1

,n):

# i = [1,2,3,...,n-1]

#i代表內層迴圈的起始值

i = j

#從右邊第乙個無序元素取出來,插入到前面有序序列中

while i >0:

if alist[i-1]

> alist[i]

: alist[i]

, alist[i-1]

= alist[i-1]

, alist[i]

i -=

1else

:#前面是有序的,遇到比它小的,就可以退出了

break

if __name__ ==

"__main__"

: li=[5

,8,2

,3,9

,1]print

(li)

執行結果:

[5,

8,2,

3,9,

1][1

,2,3

,5,8,9]

時間複雜度

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

最壞時間複雜度:o(n2)

穩定性:穩定

排序演算法Python

廢話不說直接看 計數排序 def countsort datalist 最終排好序的陣列 b 0 len datalist 計算用來儲存計數的陣列c的長度 maxnum max datalist minnum min datalist clength maxnum minnum 1 c 0 clen...

排序演算法 python

author xcy 參考別人,盡量自己寫了 命名規則不太好,不建議用list命名,但不好改了。寫的過程中遇到的問題都寫在注釋中 以下方法都在pycharm中除錯過,python3.7,但測試用例不多,難免有錯誤望批評指正 剛發現shell排序 有問題,網上的部落格都是照搬的啊,錯的也搬。還有歸併和...

Python 排序演算法

python 排序演算法 持續更新ing 內建排序 氣泡排序 0 n 2 插入排序 選擇排序 希爾排序 堆排排序 快排排序 歸併排序 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 a.sort print a 呼叫方法預設排序 a 9,5,8,7,4,3,1,6,2,0 b sort...