js常見的排序演算法

2021-09-24 15:31:37 字數 3976 閱讀 8124

冒泡演算法算是排序裡面比較基礎的一種演算法。

它的實現原理為:從第乙個元素開始,將它與下乙個索引元素比較。如果當前元素的值比下乙個元素的值要大,則兩者交換位置,否則位置不變。接下來,索引往後移一位,繼續比較接下來兩個數的值。一直重複上面的操作,直到比較到最後乙個元素,因為大的元素位置會交換位置向後移,所以,最後乙個元素已經是最大的。那麼下次在比較的時候,不需要比較最後乙個元素,只需要比較到length-2的位置

分步解釋一下過程:

最開始要從位置為0開始比較到整個length。那我們設定 i = length - 1;如果這次排序流程走完,那麼最後陣列最後一位已經是最大值,接下來只需要比較到length-2。重複以上操作。

那麼,i 限定了每次比較的位置。接下來我們來設定另外乙個變數 j,來控制每次相鄰兩個元素是否交換。**如下:

//首先我們先宣告兩個通用函式,在下面的排序演算法中都會用到。

function checkarray(array)

function swap(array,left,right)

//氣泡排序

function bubble(array) }}

return array

}複製**

排序過程如圖所示:

function insertion(array)

}return array

}複製**

插入排序過程如圖所示:

選擇排序原理:每一次從待排序的資料元素中選出最小(或最大)的乙個元素,存放待排序序列的起始位置(或末尾位置),直到全部待排序的資料元素排完。

分步說明:

1.找出帶排序元素中的最小值。如何找?我們可以先假設最小值的索引為0,如果取出的值要比最小索引上面的值小,則將最小值與索引為0的值交換。這樣索引為0的值就是最小值。

2.將索引置為1,然後向後找出,比索引1上的值小的,然後與索引1上的值交換。

3.重複步驟2,直到整個序列有序。

function selector(array)

swap(array,i,minindex)

}return array

}複製**

選擇排序過程如圖:

歸併原理:歸併排序的原理是分而治之。先將陣列兩兩分開直到最多包含兩個元素,然後進行排序。之後在進行合併,將兩兩合併的數列進行比較然後排序。直到排序完成。

分步如下:

1.假如我們有這樣一組序列 [1,2,6,3,8,4,7,5]

2.先分解數列成左右兩部分[1,2,6,3]和[8,4,7,5]

3.繼續分解左邊的陣列為[1,2]和[6,3]

4.排序上面的陣列為[1,2]和[3,6].

5.在排序陣列[1,2,3,6]

6.左邊排序完成,然後進行右邊陣列的排序,過程不變.

**如下:

function mergesortarray(array)

function mergesort(array,left,right)

while (p1 <= mid)

while (p2 <= right)

for (let i=0;ireturn array

}複製**

排序演算法如圖:

快速排序原理:快速排序演算法應該算是排序演算法裡比較複雜的一種演算法了

快速排序演算法的原理簡單來說,就是我們找出乙個基準值(以第乙個數為基準值):使得基準值的左邊的數都比基準值小,右邊的數都比基準值大。接下來對基準值左邊的序列,以第乙個數為基準值,使得基準值左邊的數比基準值小,後面的數比基準值大。

所以問題就來到了,如何使得基準值的左邊比基準值小,右邊比基準值大呢?

一般方法有兩鐘,一種是挖坑法,一種是指標交換法。我們來介紹一下指標交換法如何實現。

1.如果有這樣乙個陣列[4,2,5,3,6,1]我們首先選第乙個數6為基準數。

2.首先我們規定兩個指標分別指向陣列的左邊和右邊。簡稱哨兵左和哨兵右。

3.我們首先(重要)從哨兵右開始,從右往左移動,直到找到第乙個比基準數小的數,然後停止,很幸運,第一次就找到了,為1。

4.接下來我們哨兵左開始行動,從左往右找,直到找到乙個比基準數大的數,然後停止,此時為5.

5.接下來,交換哨兵所在位置的元素  即陣列變成4,2,1,3,6,5

6.接下來繼續,先移動哨兵左,(在元素為5的位置),繼續找比基準元素小的,此時找到了       3,然後停下。

7.哨兵右開始從左往右找,發現,當移動到3的時候,哨兵左和哨兵右相遇了。此時將基準值與哨兵位置上的值做交換。得到了3,2,1,4,6,5這樣使得基準值左邊的值都比基準值小,右邊的值都比基準值大。接下來對3,2,1進行同樣的操作。直到長度為1的時候返回。

所以**如下:

function quicksort(array)

while(array[left] < array[0] && left < right)

// 兩個指標相遇了,就將基準值與哨兵位置上的值交換

if (left === right)

//找到了,左邊指標小於右邊指標,就交換上面的值

swap(array,left,right)

}// 遞迴實現,獲取哨兵左邊的值,哨兵位置上的值,哨兵右邊的值

return quicksort(arr.slice(0,left)).concat(arr.slice(left,right+1)).concat(quicksort(arr.slice(right+1)));

}複製**

排序過程如圖:

首先我們要理解什麼是完全二叉樹?

從作為第一層的根開始,除了最後一層之外,第n層的元素個數都必須是2的n次方;第一層2個元素,第二層4個,第三層8個,以此類推。

而最後一行的元素,都要緊貼在左邊,換句話說,每一行的元素都從最左邊開始安放,兩個元素之間不能有空閒,具備了這兩個特點的樹,就是一棵完全二叉樹。

那麼完全二叉樹和堆又有什麼關係呢?

我們假設有一棵完全二叉樹,在滿足作為完全二叉樹的基礎上,對於任意乙個擁有父節點的子節點,其數值均不小於父節點的值;這樣層層遞推,就是根節點的值最小,這樣的樹,稱為小根堆。

左邊為大根堆,右邊則為小根堆。

所謂的堆排序,就是我們要將給我們的陣列模擬成堆的資料結構,然後將最大的根節點,與最後乙個節點交換。交換過後,繼續維護堆結構,使得根節點上的數又是最大數,然後繼續交換,直到排序完成。

i * 2 + 1i * 2 + 2(i - 1) /2

我們分步來看,首先構造乙個大根堆:

2.由於葉子節點沒有元素去移動位置,所以我們要從最後乙個非葉子節點來開始調整。即我們從6開始,比較其子元素和父元素的大小,如果子元素大於父元素,則兩者交換位置。交換位置後,繼續比較,保證父元素比子元素大就行。

3.繼續找非葉節點,9,4,8中9最大,所以和根元素交換位置

4.交換完成後,要繼續看是不是每個非葉子節點都滿足最大堆的要求,如果不滿足,就繼續交換位置,直到滿足最大堆的要求。

5.第一次構建最大堆完成,接下來就是交換的過程。

6.將最大堆的根元素,與末尾的值交換。

7.然後使最大堆的size(5-1)減1.

8.繼續調整結構,使其滿足最大堆的定義

9.將最大堆的根元素8與末尾元素5交換。

10.將最大堆的size減1(4-1)。然後繼續上面的過程,直到size=0停止。

function heap(array)

return array

}function heapinsert(array,index)

}function heapify(array,index,size)

}複製**

排序如圖所示:

JS常見的排序演算法

先簡單的來了解一下何謂演算法。在電腦科學與數學中,乙個排序演算法 英語 sorting algorithm 是一種能將一串資料依照特定排序方式進行排列的一種演算法 最常用到的排序方式是數值順序以及字典順序。有效的排序演算法在一些演算法 例如搜尋演算法與合併演算法 中是重要的,如此這些演算法才能得到正...

JS常見的排序演算法

前言 這裡是修真院前端小課堂,每篇分享文從 八個方面深度解析前端知識 技能,本篇分享的是 js常見的排序演算法 今天給大家分享一下,修真院官網js任務4,深度思考中的知識點 js常見的排序演算法 一 背景介紹 演算法 algorithm 是指解題方 而完整的描述,是一系列解決問題的清晰指令,演算法代...

js常見的排序演算法

最近面試可能會問這些 1,插入排序 function sort elements return res function one arr,x arr i x temp true break temp arr.push x return arr 簡單來說就是插入乙個數,在結果裡找他插入的位置。位置怎麼...