整個排序演算法分兩部分來總結,這篇總結第一部分一些相對簡單和常用的排序演算法,包括氣泡排序、選擇排序、插入排序和希爾排序。
氣泡排序應該是大家接觸的最早的排序方法了,理解起來也十分簡單。氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢「浮」到數列的頂端。
最佳情況: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其他符...