排序演算法總結 Python實現 一

2021-09-24 10:36:04 字數 2925 閱讀 7377

整個排序演算法分兩部分來總結,這篇總結第一部分一些相對簡單和常用的排序演算法,包括氣泡排序選擇排序插入排序希爾排序

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

最佳情況:t(n) = o(n)   最差情況:t(n) = o(n^2)   平均情況:t(n) = o(n^2)

#氣泡排序

def bubblesort(self, arr):

if len(arr) == 0:

return arr

for i in range(0, len(arr)-1):

for j in range(0, len(arr)-i-1):

if arr[j+1] < arr[j]:

temp = arr[j+1]

arr[j+1] = arr[j]

arr[j] = temp

return arr

表現最穩定的排序演算法之一,因為無論什麼資料進去都是o(n2)的時間複雜度,所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。理論上講,選擇排序可能也是平時排序一般人想到的最多的排序方法了吧。

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

最佳情況:t(n) = o(n2)  最差情況:t(n) = o(n^2)  平均情況:t(n) = o(n^2)

#選擇排序

def selectionsort(self, arr):

if len(arr) == 0:

return arr

for i in range(0, len(arr)-1):

min_index = i

for j in range(i, len(arr)):

if arr[j] < arr[min_index]:

min_index = j

if min_index == i:

continue

else:

temp = arr[i]

arr[i] = arr[min_index]

arr[min_index] = temp

return arr

插入排序(insertion-sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

最佳情況:t(n) = o(n)   最壞情況:t(n) = o(n^2)   平均情況:t(n) = o(n^2)

#插入排序

def insertsort(self, arr):

if len(arr) == 0 or len(arr) == 1:

return arr

for i in range(1, len(arr)):

current = arr[i]

j = i

while j > 0 and arr[j-1] > current:

arr[j] = arr[j-1]

j -= 1

arr[j] = current

return arr

希爾排序是希爾(donald shell)於2023年提出的一種排序演算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的乙個更高效的版本,也稱為縮小增量排序,同時該演算法是衝破o(n2)的第一批演算法之一。它與插入排序的不同之處在於,它會優先比較距離較遠的元素。希爾排序又叫縮小增量排序。

演算法過程的理解如下:

最佳情況:t(n) = o(

#希爾排序

def shellsort(self, arr):

if len(arr) == 0:

return arr

increasement = len(arr)

while increasement > 1:

#每次縮小增量

increasement = increasement // 3 + 1

for i in range(0, increasement):

#在每個子串行中進行直接插入排序

for j in range(i + increasement, len(arr), increasement):

#相比於直接插入排序,這裡增加乙個比較,由於增量分組大部分都已有序,可降低複雜度,從而發揮增量分組的優勢

if arr[j] < arr[j - increasement]:

current = arr[j]

k = j

while k > 0 and arr[k - increasement] > current:

arr[k] = arr[k - increasement]

k -= increasement

arr[k] = current

return arr

排序演算法總結 python實現

最近在複習軟考,把看到的排序演算法整理了一下,之所以用python寫,是因為python寫起來簡單.好吧,後來寫的時候發現有些地方用c寫還方便些。python雖然簡潔,但用起來效率感覺還是有些低,不過這不是重點啦。coding utf 8 def bubblesort data 氣泡排序 時間複雜度...

python實現排序演算法一 快速排序

快速排序演算法 基本思想 分治法,將陣列分為大於和小於該值的兩部分資料,然後在兩部分資料中進行遞迴排序,直到只有乙個資料結束 step1 取陣列第乙個元素為key值,設定兩個變數,i 0,j len a 1 step2 j從後面開始遍歷,遇到小於key的值,則a i a j step3 i從前面開始...

排序演算法python實現

先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...