常用的排序演算法和Python內建的sorted方法

2021-10-09 01:54:02 字數 4587 閱讀 8247

一.排序演算法

1.選擇排序

基本思想:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然後,再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。以此類推

:"""選擇排序"""

for i in

range

(len

(lst)):

# 外層迴圈,i為從0開始下標

min_index = i # 假設i為最小值的下標

for j in

range

(i +1,

len(lst)):

# 內層迴圈,j為未排序序列下標

if lst[j]

< lst[min_index]

: min_index = j # 將未排序序列中找到的最小值賦給min_index

lst[i]

, lst[min_index]

= lst[min_index]

, lst[i]

# 交換值

return lst

2.氣泡排序

基本思想: 讓乙個數字和它相鄰的下乙個數字比較,如果前乙個數字大於後乙個數字,交換兩個變數的值

:"""氣泡排序"""

for j in

range(0

,len

(lst)-1

):# 外層迴圈,這個迴圈負責氣泡排序進行的次數

for i in

range(0

,len

(lst)

- j -1)

:# 內層迴圈,i為列表下標

if lst[i]

> lst[i +1]

: lst[i]

, lst[i +1]

= lst[i +1]

, lst[i]

# 如果if成立,交換值

return lst

3.插入排序

基本思想: ①將第一待排序序列第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列

​ ②從頭到尾依次掃瞄未排序序列,將掃瞄到的每個元素插入有序序列的適當位置

:"""插入排序"""

# 遍歷列表中的所有元素,其中0號索引元素預設已排序,因此從1開始

for i in

range(1

,len

(lst)):

# 將該元素(j+1)與已排序好的元素(j)從右到左依次比較,如果比該元素(j)小,則交換

# range(i-1,-1,-1)

for j in

range

(i -1,

-1,-

1):if lst[j]

> lst[j +1]

: lst[j]

, lst[j +1]

= lst[j +1]

, lst[j]

return lst

4. 希爾排序

希爾排序也算插入排序的一種,比起直接插入排序來說,更高效

基本思想:①先將整個待排元素序列分割成若干個子串行,分別進行插入排序

​ ②依次縮減增量再進行排序,直至增量為1

:"""希爾排序"""

step =

int(

len(lst)/2

)# 規定步長

while step >0:

# 判斷是不是最後一次排序

for index in

range(0

,len

(lst)):

if index + step <

len(lst)

: temp = lst[index]

if temp > lst[index + step]

:# 比較步長前後元素大小

lst[index]

, lst[index + step]

= lst[index + step]

, lst[index]

print

(lst)

step =

int(step /2)

# 步長減半

return lst

print

(shell_sort([9

,1,2

,5,7

,4,8

,6,3

,5])

)#[4, 1, 2, 3, 5, 9, 8, 6, 5, 7]

#[2, 1, 4, 3, 5, 6, 5, 7, 8, 9]

#[1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

#[1, 2, 3, 4, 5, 5, 6, 7, 8, 9]

二.python內建的sorted方法

1. sorted() 和 list.sort() 方法比較

主要區別在於列表的sort方法是對已經存在的列表進行操作,而python內建函式sorted返回的是乙個新的list。

lst1 =[1

,3,7

,2,6

,4,9

,5]print

(lst1.sort())

print

(lst1)

#none

#[1, 2, 3, 4, 5, 6, 7, 9]

lst2 =[2

,5,6

,7,3

,1,4

]print

(sorted

(lst2)

)print

(lst2)

#[1, 2, 3, 4, 5, 6, 7]

#[2, 5, 6, 7, 3, 1, 4]

也就是說list.sort 方法會就地排序列表,不會把原列表複製乙份。這也是這個方法的返回值是none的原因,提醒你本方法不會新建乙個列表。在這種情況下返回none其實是python的乙個慣例,如果乙個函式或者方法對物件進行的是就地改動,那它就會返回none,好讓呼叫者知道傳入的引數發生了變動,而且並未產生新的物件。

而sorted它會新建乙個列表作為返回值。這個方法可以接受任何形式的可迭代物件作為引數,甚至包括不可變序列或生成器,最後都會返回乙個列表。

2.sorted和list.sort()中的兩個引數

sorted(__iterable,key,reverse)

list.sort(self,key,reverse)

reverse

如果被設定為 true,被排序的序列裡的元素會以降序輸出,這個引數的預設值是 false。

key

乙個只有乙個引數的函式,這個函式會被用在序列裡的每乙個元素上,所產生的結果將是排序演算法依賴的對比關鍵字,這個引數的預設值是恒等函式,也就是預設用元素自己的值來排序。key這個引數的存在幫助我們實現複雜排序要求。比如說,在對列表中一些字串排序時,可以用key=str.lower來實現忽略大小寫的排序,或者是用key=len進行基於字串長度的排序,當然key的引數也可以是個匿名函式。

lst =[(

'e',4)

,('o',2)

,('!',5)

,('v',3)

,('l',1)

]print

(sorted

(lst, key=

lambda x: x[1]

))# [('l', 1), ('o', 2), ('v', 3), ('e', 4), ('!', 5)]

d =print

(sorted

(d.items(

), key=

lambda item: item[1]

))# [('jason', 19), ('tom', 22), ('jack', 25), ('rose', 32)]

內排序演算法

每次需要排序的時候總是會忘記基本的排序演算法,為了防止自己再次忘記,寫個部落格加深自己的印象 簡單選擇排序大概就是最簡單我們最容易想到的一種排序方法,一共進行n 1次選擇,在第i次選擇中選擇第i小的數放在相應的位置。我們可以想象一種場景,有一些賬單需要我們按照時間進行排序,我媽每次選擇最早的一張拿在...

Python常用的排序演算法

拿li 1,3,45,6,78,9,4 來舉例 空間複雜度o n的2次方 原理 例如你把一組資料從頭開始依次遍歷過去把最大的或者最小的放在末尾,除了最後乙個每個依次進行遍歷 def bubble sort li for i in range len li 1 flag true for j in r...

python 常用排序演算法

常用的排序演算法 氣泡排序,插入排序,歸併排序,快速排序 基數排序 堆排序,直接選擇排序。常用的查詢演算法 順序查詢,二分查詢,雜湊表查詢和二叉樹查詢 其中我們應該重點掌握二分查詢 歸併排序和快速排序,保證能隨時正確 完整地寫出它們的 同時對其他的查詢和排序必須能準確說出它們的特點 對其平均時間複雜...