排序 各種排序的總結

2021-09-02 20:36:31 字數 2654 閱讀 6237

1、氣泡排序 & 快速排序

可能很多人會奇怪為何會把這兩種排序方式放在一起,那是因為,氣泡排序恰好是快速排序的最壞情況,相應地快速排序則是氣泡排序的優化。

氣泡排序的思想:每次比較相鄰的元素,共比較 n-1 輪。排序過程中,左邊是待排序序列,右邊是已排序序列。屬於穩定排序演算法。

快速排序的思想:兩個關鍵指標,乙個關鍵資料。實現關鍵資料左側都小於關鍵資料的值,右側都大於關鍵資料的值。以此方式遞迴,最後實現公升序。降序亦然。屬於不穩定排序演算法。

2、選擇排序 & 堆排序

這兩種方法放在一起是因為,每次都是選擇最值去進行元素的交換。

選擇排序的思想:每次選擇後續最小的元素與當前位置交換。排序過程中,左邊是已排序序列,右邊是待排序序列。屬於穩定排序演算法。

堆選擇排序的思想:以大根堆實現公升序為例。建立初始堆,調整為最大堆後將堆頂和當前待排序序列的最後乙個元素交換。然後一直重複以上步驟,最後實現公升序的效果。屬於不穩定排序演算法。

3、直接插入排序 & 希爾排序

直接插入排序的思想:每次從待排序序列中選取元素插在已排序序列的適當位置,這個過程中可能會出現大量元素移動的情況,所以不適宜資料量大的排序應用。屬於穩定排序演算法。

希爾排序,也稱縮小增量排序。首次選用資料量長度 n 的 1/2 作為增量,分為 n/(n/2)=2 組,分別進行插入排序。之後增量

每次減半直至為1,重複以上操作,達到排序的目的。屬於不穩定排序演算法。

shell演算法的效能與所選取的分組長度序列有很大關係。只對特定的待排序記錄序列,可以準確地估算關鍵碼的比較次數和移動次數。

4、歸併排序

歸併排序,merge-sort 演算法。是分治演算法的乙個典型應用。先 sort 再 merge,通常採用遞迴寫法。

5、基數排序

此中排序方式不基於比較和移動的思想,而是基於分配式思想。

主要是根據數值型的不同數字上的數進行排序,分為分配和收集兩個步驟,並且不斷迭代直至最高/低位。並且根據迭代過程中採用更高還是更低位分為 最高位優先(most significant digit first,msd)和最低位優先(least significant digit first,lsd)。屬於穩定排序演算法。

接下來舉個栗子,22, 33, 43, 55, 14, 28, 65, 39, 81, 33, 100,假定按照lsd法,即最低位優先原則,對以上序列進行非降序排序。

首先根據數字最低位進行分配,即個位:

然後進行採集操作,採集的過程就是串聯的過程,如上圖所示,經過這次採集得到新序列為 100, 81, 22, 33, 43, 33, 14, 55, 65, 28, 39 。

接下來,對新序列進行第二次分配和採集,即按照從最右側開始的第二位(十位)的順序分配,如下圖所示,此時得到的新序列為 100, 14, 22, 28,33, 33,39, 43, 55, 65, 81 。

接下來,對最新的序列進行第三次分配和採集,即按照從最右側開始的第三位的順序分配,如下圖所示,因為一共就只有乙個數100是3位數,所以其他的數都依次被分配到桶0中,桶1中含有100 。

最後再將這些數採集起來,如下圖所示,此時得到的序列為 14, 22, 28,33, 33,39, 43, 55, 65, 81, 100 。可以看到100的空間位置從位置0直接挪動到最後。

最後需要注意的是,因為每個桶內的元素個數是未知的,所以需要借助鍊錶結構來實施分配時向桶內仍記錄的過程。

很多時候對基數排序的闡述都是針對數值排序,包括上面的舉的那個例子也是針對數值排序的,但是仔細想想數值的大小是已知的,如果再將數值按位拆分再排序,有時候是沒有必要的。而演算法的目的是找到最佳解決問題的方案,而不是把簡單的事搞的更複雜。

因此基數排序主要的應用在**呢? 目前未得到很好的驗證,等以後有了想法再來補充。

6、桶排序

桶排序(bucket sort),也即箱排序。工作的原理是將陣列分到有限數量的桶裡。每個桶再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。桶排序是鴿巢排序的一種歸納結果。屬於穩定排序演算法。

首先,我們講一下最簡單的桶排序。給你乙個陣列,想要實現 o(1) 的排序方法,你會怎麼做呢?

假設其中最大值為 maxn,這時候我們弄 maxn 個桶,出現過則在相應桶裡放 1 的標記,沒出現過就放 0 的標記。最後我們按序輸出標記為 1 的桶的序號,就可以實現排序。

但是當資料量很大的時候,我們如何去找這麼多桶呢?因此就有了下面桶裡放的是很多數值而非 0/1 標記的方法。

設有陣列 array = [29, 25, 3, 49, 9, 37, 21, 43],那麼陣列中最大數為 49,先設定 5 個桶,那麼每個桶可存放數的範圍為:0-9、10-19、20-29、30-39、40-49,然後分別將這些數放人自己所屬的桶。

之後分別對每個桶裡面的數進行排序,或者在將數放入桶的同時用插入排序進行排序。

最後,將各個桶中的資料有序的合併起來。

各種排序總結

1.氣泡排序 時間複雜度 進行兩重迴圈,因此是o n 2 空間複雜度 原地排序,無需其他額外的空間,因此是o 1 void bubblesort int array,int length 2.快速排序 思想 快排的乙個重要思想是遞迴。每一輪遞迴,需要選出乙個基準元素 最好隨機選取,下面附的 是以第乙...

各種排序演算法總結

注 以下所講排序,以公升序排序為例!選擇排序 作者思路 在一組數中,選擇第乙個數標記為最小值,在剩下的數中找比它小的數,若找到則交換兩數,標記新的 最小值 然後繼續往下找,這樣一趟下來就可以找到一組數中第二小的值,第二次以第二個數作為最小值,如此迴圈下去。這是最簡單 最基礎的一種排序演算法。例子 1...

各種排序演算法總結

1 插入排序 void insertsort int a,int n a j 1 key 插入排序是穩定的排序,平均和最壞時間複雜度是o n 2 最好的時間複雜度是o n 對應於全部排好序的情況。2 氣泡排序 void bubblesort int a,intn 氣泡排序是穩定的排序,平均和最壞時間...