10大排序演算法總結

2021-10-05 17:24:23 字數 3224 閱讀 3395

**1:

**2:

**3:

3.1、氣泡排序

把第乙個元素與第二個元素比較,如果第乙個比第二個大,則交換他們的位置;

接著繼續比較第二個與第三個元素,如果第二個比第三個大,則交換他們的位置;

對每一對相鄰元素作同樣的工作,這樣一趟比較交換下來之後,排在最右的元素就會是最大的數;

除去已經選出的,最右邊的元素,對剩餘的元素做同樣的工作,如此重複下去,直到排序完成。

3.2、選擇排序

首先,找到陣列中最小的那個元素,其次,將它和陣列的第乙個元素交換位置。其次,在剩下的元素中找到最小的元素,將它與陣列的第二個元素交換位置。如此往復,直到將整個陣列排序。

3.3、插入排序

將第一待排序序列第乙個元素看做乙個有序序列,把第二個元素到最後乙個元素當成是未排序序列。

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

3.4、希爾排序

先將整個待排序的記錄序列分割成為若干子串行分別進行直接插入排序,待整個序列中的記錄"基本有序"時,再對全體記錄進行依次直接插入排序。

3.5、歸併排序

通過遞迴的方式將大的陣列一直分割,直到陣列的大小為 1,此時只有乙個元素,那麼該陣列就是有序的了,之後再把兩個陣列大小為1的合併成乙個大小為2的有序陣列,再把兩個大小為2的合併成4的 ….. 直到全部小的陣列合併起來。

3.6、快速排序

從陣列中選擇乙個元素,稱之為中軸元素,然後把陣列中所有小於中軸元素的元素放在其左邊,所有大於或等於中軸元素的元素放在其右邊,顯然,此時中軸元素所處的位置的是有序的。也就是說,我們無需再移動中軸元素的位置。

從中軸元素那裡開始把大的陣列切割成兩個小的陣列(兩個陣列都不包含中軸元素),接著我們通過遞迴的方式,讓中軸元素左邊的陣列和右邊的陣列也重複同樣的操作,直到陣列的大小為1,此時每個元素都處於有序的位置。

3.7、堆排序

把堆頂的元素與最後乙個元素交換,交換之後破壞了堆的特性,我們再把堆中剩餘的元素再次構成乙個大頂堆,然後再把堆頂元素與最後第二個元素交換….如此往復下去,等到剩餘的元素只有乙個的時候,此時的陣列就是有序的了。

3.8、計數排序

就是把陣列元素作為陣列的下標,然後用乙個臨時陣列統計該元素出現的次數,例如 temp[i] = m, 表示元素 i 一共出現了 m 次。最後再把臨時陣列統計的資料從小到大彙總起來,此時彙總起來是資料是有序的。

3.9、桶排序

把最大值和最小值之間的數進行瓜分,例如分成  10 個區間,10個區間對應10個桶,我們把各元素放到對應區間的桶中去,再對每個桶中的數進行排序,可以採用歸併排序,也可以採用快速排序之類的。之後每個桶裡面的資料就是有序的了,我們在進行合併彙總。

將資料分段放入桶中:

排序後,取出:

3.10、基數排序

先以個位數的大小來對資料進行排序,接著以十位數的大小來多數進行排序,接著以百位數的大小……

排到最後,就是一組有序的元素了。不過,他在以某位數進行排序的時候,是用「桶」來排序的。

由於某位數(個位/十位….,不是一整個數)的大小範圍為0-9,所以我們需要10個桶,然後把具有相同數值的數放進同乙個桶裡,之後再把桶裡的數按照0號桶到9號桶的順序取出來,這樣一趟下來,按照某位數的排序就完成了。

【2015阿里巴巴研發工程師筆試題】個數約為50k的數列需要進行從小到大排序,數列特徵是基本逆序(多數數字從大大小,個別亂序),以下哪種排序演算法在事先不了解數列特徵的情況下效能最優。( ) a. 氣泡排序  b. 改進氣泡排序  c. 選擇排序  d. 快速排序  e. 堆排序  f.插入排序

根據題目中的描述,首先我們可以排除a、b、c,因為它們的時間複雜度都是o(n)。接下來我們看下d選項,我們前面提到過,快速排序在最壞情況下的時間複雜度會退化至o(n^2),f選項的插入排序在逆序數很大時效能也很差(o(n^2))。而堆排序在最壞情況下的複雜度也為o(logn),所以這裡我們應該選擇堆排序。

【2016阿里巴巴校招筆試題】現有1gb資料進行排序,計算資源只有1gb記憶體可用,下列排序方法中最可能出現效能問題的是( )

a. 堆排序  b. 插入排序  c. 歸併排序  d. 快速排序  e. 選擇排序  f. 氣泡排序

根據題目的描述,我們能夠很明確的知道這道題考察我們的是原地排序的概念,這裡我們只需要選擇非原地排序的占用額外空間最大的演算法,顯然答案是」c. 歸併排序"。

【京東】假設你只有100mb的記憶體,需要對1gb的資料進行排序,最合適的演算法是( )

a. 歸併排序  b. 插入排序  c. 快速排序  d. 氣泡排序

根據題目,我們可以知道,我們現有的記憶體限制使得我們無法把資料一次性載入到記憶體中,所以我們只能先載入一部分資料,對其排序後存入磁碟中。然後再載入一些資料,把它們「合併」到已排序的資料集中去,重複這個過程直到排序完成,顯然最能勝任這個工作的是歸併排序。

排序演算法 九大排序演算法總結

參考部落格 排序演算法 直接插入排序 時間複雜度 空間複雜度 o 1 穩定性 穩定 參考部落格 排序演算法 希爾排序 時間複雜度 空間複雜度 o 1 穩定性 不穩定 參考部落格 排序演算法 選擇排序 時間複雜度 空間複雜度 o 1 穩定性 不穩定 參考部落格 排序演算法 堆排序 時間複雜度 空間複雜...

演算法 九大排序演算法總結

這裡我不採用陣列來進行排序,而是採用更加符合應用的資料結構來排序。define m 100 typedef int datatype typedef struct nodetable 這是一種簡單描述,更加詳細的資料機構應該是下面這樣 但是為了方便描述還是使用上面的簡單結構 define m 100...

js 10 大排序演算法

演算法思想 js實現 const swap function arr,i,j const merge function left,right else while left.length result.push left.shift while right.length result.push ri...