深入理解各種排序演算法

2022-02-25 01:33:32 字數 4804 閱讀 9251

### hahah

1-------插入排序

這種排序的方法是,舉個例子

陣列 [ 3,2,5,4,8,7,1] ,這裡我們預設用的是從小到大的排序

1   此時陣列為 [ 3,2,5,4,8,7,1] ,選出第二項 「2」 ,與第一項 「3」 比較,交換位置,陣列變成 [ 2,3,5,4,8,7,1] ,此輪比較結束

2   此時陣列為 [ 2,3,5,4,8,7,1] ,選出第三項 「5」,與第二項 「3」 進行比較,結果可知,不用交換位置,此輪比較結束

3    此時陣列還是為 [ 2,3,5,4,8,7,1] ,選出第四項 「4」 ,與第三項 「 5」 進行比較,兩個交換位置,得到陣列為  [ 2,3,4,5,8,7,1] ,然後在比較這個新的第三項 "4" 與第二項 「3」 ,結果不需要交換,此輪比較到此結束

4   此時陣列為 [ 2,3,4,5,8,7,1] ,選出第五項 「8」 與第四項 「 5」 比較,此時陣列不變,此輪結束

5   此時陣列還是為 [ 2,3,4,5,8,7,1]  ,選出第六項 「7」 與第五項 「8」比較,交換位置,此時陣列為 [ 2,3,4,5,7,8,1]  ,在向前比較 「7」與 「5」,陣列不變,此輪結束

6   此時陣列為 [ 2,3,4,5,7,8,1]  ,選出最後一項 「1」 ,與 「8」比較,交換位置,陣列變成 [ 2,3,4,5,7,1,8] ,「1」在向前與「7」比較,再交換,一直比較下去,知道沒有可交換的為止。

怎麼用**來實現呢?

先把這個思路弄清楚,舉個例子。還是原來的陣列 [ 3,2,5,4,8,7,1]

我們的第一步是選擇 「2」 ,與「 3」  比較。 [ 3,2,5,4,8,7,1]

第二步是選擇 「5」,與 「3」,「2」 比較 [ 3,2,5,4,8,7,1]

第三步是「4」,與前面的比較    [ 3,2,5,4,8,7,1]

第四步類推     [ 3,2,5,4,8,7,1]

最後一步  [3,2,5,4,8,7,1]

以此類推,那麼我們可以定義兩層的迴圈,第一層迴圈是 2,5,4,8,7,1,第二層迴圈就是第一層前面的數字。滿足條件的時候就交換。這裡由於是向前比較,第二層迴圈的時候,就採用了逆迴圈。

function insert(arr) }}

return arr

}console.log(insert([3,3,4,2,1,4,4,3,7,8]))

2-------氣泡排序

這種排序的方法是,舉個例子。還是上面的陣列 [ 3,2,5,4,8,7,1] 

第一步:選擇第一項和第二項,比較,交換位置,陣列變成了 [ 2,3,5,4,8,7,1] 

第二步,選擇第二項與第三項,比較,還是 [ 2,3,5,4,8,7,1] 

第三步,選擇第三項與第四項,比較,交換位置,陣列變成了 [ 2,3,4,5,8,7,1] 

以此類推,選擇兩個相鄰的元素,一直比較交換下去。結束第一輪,得到陣列 [ 2,3,4,5,7,1,8] ,最後一位 「8」 ,是最大的數字,固定不變,

第二輪的遍歷,同理,得到 [ 2,3,4,5,1,7,8]  ,最後兩位 「7」,「8」 固定下來,進行下一輪

那怎麼用**來實現呢?我們也是先整理一下思路

一輪 [ 3,2,5,4,8,7,1], [ 2,3,5,4,8,7,1], [ 2,3,5,4,8,7,1], [ 2,3,4,5,8,7,1] , [ 2,3,4,5,8,7,1], [ 2,3,4,5,7,8,1],[ 2,3,4,5,7,1,8]

二輪  [2,3,4,5,7,1,8],[ 2,3,4,5,7,1,8],[ 2,3,4,5,7,1,8],[ 2,3,4,5,7,1,8],[ 2,3,4,5,7,1,8],[ 2,3,4,5,1,7,8]

三輪 [2,3,4,5,1,7,8],[ 2,3,4,5,1,7,8],[ 2,3,4,5,1,7,8],[ 2,3,4,5,1,7,8],[ 2,3,4,1,5,7,8]

四輪 [2,3,4,1,5,7,8],[ 2,3,4,1,5,7,8],[ 2,3,4,1,5,7,8],[ 2,3,1,4,5,7,8]

五輪[2,3,1,4,5,7,8],[ 2,3,1,4,5,7,8],[ 2,1,3,4,5,7,8]

六輪[2,1,3,4,5,7,8],[ 1,2,3,4,5,7,8]

七輪[1,2,3,4,5,7,8]

這個是我們執行一次的結果,這個就是乙個兩輛比較的操縱,我們直接乙個for迴圈就可以了

在外面,在套上乙個for迴圈,用來制指定執行的論述,可以看出來,每一輪都是固定乙個值,所以輪數就是我們的陣列的長度。

我們可以外面定義乙個for迴圈,用來迴圈輪數,裡面寫乙個for迴圈,用來比較交換

function bubble(arr) }}

return

arr }

console.log(bubble([

1,2,3,4,5,7,8]))

3-------選擇排序舉例說明,還是陣列[ 3,2,5,4,8,7,1] 

這個選擇排序思路很簡單,就是找出陣列中最小的元素,插入到新的陣列,並且當前陣列刪除這個最小項

第一步:[1]   [ 3,2,5,4,8,7] 

第二步:[1,2]   [ 3,5,4,8,7] 

**思路分析:

先找出陣列中的最小項,放入新陣列,同時確定這個最小項的索引,根據這個索引,當前陣列刪除這個最小項

以上的操作,只能進行一次,所以我們在外面加一層的迴圈,讓他執行多次,次數就是陣列的長度

"en

">

4-------快速排序這個排序的理解要比上面的兩個麻煩一點點,還是拿那個陣列[ 3,2,5,4,8,7,1]

首先我們先找出乙個基準,通常情況下,我們選擇的第乙個數,也就是「3」當作基準。

第一步 [ 3,2,5,4,8,7,1],這兩個橙色的數字出隊比較,數字1小於 基準3,兩個交換位置,變成 [ 1,2,5,4,8,7,3],數字1歸隊

第二步 [ 1,2,5,4,8,7,3],數字1歸隊之後,他的下乙個是數字2,出隊與基準比較,兩個位置不變。數字2歸隊

第三步 [ 1,2,5,4,8,7,3

],數字2歸隊之後,下乙個數字5站出來與基準比較,交換位置,[ 1,2,3,4,8,7,5],數字5歸隊

第四步 [ 1,2,3

,4,8

,7,5], 數字5歸隊之後,他的上乙個數字7站出來,與基準比較,沒變化,不變

第五步[ 1,2,3,4,8,7,5] 數字8出來比較,不變

第六步[ 1,2,3,4,8,7,5] 數字4出來比較,沒變化,但是數字4歸隊之後,已經沒有可以與基準比較的數字了。因此。第一輪結束,基準固定

[1,2,

3,4,8,7,5],可以看到,基準左邊的都小於基準,右邊的都比他大。現在第二輪開始

[1,2]出來比較,設定1為基準,2出隊比較,位置不變,2回隊之後,發現沒有繼續比較的數字了,因此,基準1固定,2默默的乙個人回去。

[8,7,5]基準為8,5出隊比較,交換位置,變成[5,7,8],5回隊之後,7出來比較,位置不變,但是7回去之後,已經沒有了可以出來比較的數字,結束。基準固定。數字8位置固定

然後是[5,7

],設定基準為5,7出來比較,位置不變,然後7歸隊之後,發現沒有剩下的數字可以與基準比較了,因此,基準固定,數字7默默的歸隊。

到此,所有的比較就都才是結束了

同理,怎麼用**來實現了,我們也是先來找找規律。

第一步 [ 3,2,5,4,8,7,1],3,1比較,變成[ 1,2,5,4,8,7,3]

第二步 [ 1,2,5,4,8,7,3],2,3比較,不變

第三步 [ 1,2,5,4,8,7,3],5,3比較,變成[ 1,2,3,4,8,7,5]

第四步[ 1,2,3,4,8,7,5],3,7比較,不變

第五步[ 1,2,3,4,8,7,5],2,8比較,不變

第六步[ 1,2,3,4,8,7,5],3,4比較,此時3的位置確定。分成了兩個區間。[ 1,2,

3,4,8,7,5]

可以看出來什麼規律沒有?這個藍色區域的變化。上面一共有4個藍色表示的數字分別是1,7,8,4.

再看看橙色的數字,分別是2,5.然後再綜合起來看。是不是先藍色方向的遍歷,找到滿足的數字,交換之後,

就變成了橙色方向的遍歷,橙色也是同理,不滿足條件,就一直往前找,知道找到。交換之後,再變成藍色的遍歷方向

因此,我們可以理解為,設定兩個指標,first和last.。首先last指向最後乙個數字,從這裡開始,向前移動,直到找到第乙個比基準小的數字。

找到之後,互動位置,last指向下乙個位置。再換成first向後移動,找到第乙個比基準大的數字。然後交換。first指向下乙個位置。再換成last移動,就這樣你來我往的移動起來。

那什麼時候確定位置呢?

首先,[ 3,2,5,4,8,7,1] ,first用綠色,last用黃色。這裡為了**方便,就只是標記指向

交換之後[ 1,2,5,4,8,7,3],first像前移動。在數字7的位置

然後是last移動了,找到比基準大的數字,也就是數字5,交換之後,first向後移動,得到[ 1,2,3,4,8,7,5],此時first指向數字4的位置。

然後就是last移動了,移動到了數字4的位置,還是沒有找到小於基準3的數字。再向前移動,指向數字3的位置,此時變成了這樣子[ 1,2,3,4,8,7,5]

黃色跑到了綠色的前面,結束

深入理解排序演算法

1.排序 sort 2.演算法 algorithm 3.常用排序演算法 術語解讀 時間複雜度 執行演算法所需要的計算工作量 耗費的時間 一般來說,計算機演算法是問題規模n 的函式f n 記做t n f n 氣泡排序 問題規模為n,需要比較n次,所以平均時間複雜度為o n 歸併排序 問題規模通過分治法...

深入理解各種建構函式

include includeusing namespace std class test else test const test t else test operator const test t pdata new char strlen t.pdata 1 strcpy pdata t.pd...

深入理解希爾排序

希爾排序是按照不同步長對元素進行分組插入排序的,當剛開始元素很無序的時候,步長最大,所以插入排序的元素個數很少,速度很快 當元素基本有序了,步長很小,插入排序對於有序的序列效率很高。所以,希爾排序的時間複雜度會優於o n 2 具體實現 如下,先看一種複雜一點的,但是便於理解的實現 for int i...