排序演算法可以說是非常重要的基礎演算法。可能一般少有單獨排序的任務,但是大多任務都是基於排序演算法的。現在,對於排序演算法進行乙個總結。
排序演算法可以分為兩種,第一種是比較類的,第二種是非比較類的。比較類演算法包括插入排序,選擇排序,快速排序等等方法;非比較類演算法包括計數排序,桶排序和計數排序。
比較類的演算法都是元素之間的相互比較然後更換位置等等,其時間複雜度一般是o(n
2)
o(n^2)
o(n2
),最優的時間複雜度一般是o(n
logn
)o(nlogn)
o(nlog
n),但是耗費的空間很少。而非比較類的演算法是通過一些函式對映然後在分類的,其演算法複雜度可以達到o(n
)o(n)
o(n)
,但是會耗費很多的空間。
非比較類
非比較類的排序演算法都是通過某乙個對映函式將數字對映到乙個容器裡,然後比較的。演算法的時間複雜度比較低,一般都是o(n
)o(n)
o(n)
級別的,但是空間複雜度就很高了,也是o(n
)o(n)
o(n)
級別的。
其中,計數排序法只能操作整數,將最大值和最小值之間所有的整數設定為容器,加入最大為5,最小為0,那我們就設定6個桶:0,1,2,3,4,5,6,然後將數字一次遍歷放到桶中去。由於桶和桶之間的順序我們已經知道了,所以我們只需要合併即可。計數排序法非常適合於有範圍的比較,比如我們的評分是1-5分,這種比較使用計數排序效率非常高,耗費的空間也不是很大,並且幾乎沒有浪費。
桶排序是計數排序的公升級版,它不再是每乙個整數設定為乙個容器了,它把整個數列的範圍設定成若干個容器,比如將0-10設定成5個容器,那麼就是0-2,2-4,4-6,6-8,8-10。然後堆每個容器進行排序,這裡呼叫的排序演算法哪個都可以,當然最終的效率也和呼叫的演算法有關。桶排序就可以操作小數了。桶排序預設數字的分布是服從均勻分布的,這時候的效果就很好了。
基數排序有一種按照重要性排序的意思,我們先按照個位數排序,然後是十位數,依次類推,這樣的排序方法處理負數和小數比較麻煩。當數字分布不是均勻分布的時候,基數排序不會有那麼多浪費的空間。
比較類o(n
2)
o(n^2)
o(n2
)級別的演算法
說到o (n
2)
o(n^2)
o(n2
)的演算法,一般指的都是氣泡排序法,插入排序法和選擇排序法。這三個排序方法思想比較簡單,但是他們之間比較容易混淆。雖然他們的時間複雜度很高,但是空間複雜度很低,都是o(1
)o(1)
o(1)
,也就是說可以在數列本身的空間上進行排序。
低於o (n
2)
o(n^2)
o(n2
)的演算法
時間複雜度低於o(n
2)
o(n^2)
o(n2
)的演算法也借鑑了o(n
2)
o(n^2)
o(n2
)的思想。希爾排序是第乙個突破o(n
2)
o(n^2)
o(n2
)的排序演算法,希爾排序法是插入排序的改進,插入排序法一次只能移動乙個位置,但是希爾排序法在最開始ide時候一次可以移動多個位置,其最好的時間複雜度大概在o(n
1.3)
o(n^1.3)
o(n1.3
)左右。
歸併排序利用了分而治之的思想,先將序列分成兩個字串,然後在遞迴呼叫排序,最後只需要合併到一起就好了,其演算法的時間複雜度是o(n
logn
)o(nlogn)
o(nlog
n),空間富足度比較高,是o(n
)o(n)
o(n)
。快速排序法是我們使用最多的一種排序方法,其思想是選定乙個標準,然後標準兩邊放置是比基準小和比基準大的數,然後遞迴呼叫快速排序法,最終直到排好序。其時間複雜度是o(n
logn
)o(nlogn)
o(nlog
n),達到了排序演算法時間複雜度的下界,但同時它也會佔據o(n
logn
)o(nlogn)
o(nlog
n)的額外空間。
堆排序從效果上來看是最好的了,其時間複雜度不論輸入資料如何都是o(n
logn
)o(nlogn)
o(nlog
n),並且空間複雜度是o(1
)o(1)
o(1)
。但是在實現的時候使用了堆的概念,實現起來不是很方便,應用範圍目前也趕不上快速排序。
演算法詳解和python實現
氣泡排序法
選擇排序法
插入排序法
希爾排序法
歸併排序法
快速排序法
堆排序法
計數排序法
桶排序法
基數排序法
十大排序演算法
1.非線性時間類排序 時間複雜度未突破 0 nlog 2n 不穩定的四個排序演算法 選擇排序 0 n2 希爾排序 0 n1.3 希爾排序實現python 快速排序 0 n log2 n 0 nlog 2n 0 nlog 2 n 快速排序實現c python 堆排序 0 n log2 n 0 nlog...
十大排序演算法
排序規則 從左至右依次增大 一 基於比較的排序演算法 插入排序 逐個遍歷未排序序列,將其在已排序序列中從右到左比較,直到遇到比自己小的數,然後將元素插入到那個數的後面,有序序列從左向右生長。選擇排序 在未排序序列中選擇最小的元素,將其插入到已排序序列的末尾,有序序列從左向右生長。氣泡排序 從左至右逐...
十大排序演算法
github 排序演算法是 資料結構與演算法 中最基本的演算法之一。排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序演算法有 插入排序 希爾排序 選擇排序 氣泡排序 歸併排序...