冒泡演算法算是排序裡面比較基礎的一種演算法。
它的實現原理為:從第乙個元素開始,將它與下乙個索引元素比較。如果當前元素的值比下乙個元素的值要大,則兩者交換位置,否則位置不變。接下來,索引往後移一位,繼續比較接下來兩個數的值。一直重複上面的操作,直到比較到最後乙個元素,因為大的元素位置會交換位置向後移,所以,最後乙個元素已經是最大的。那麼下次在比較的時候,不需要比較最後乙個元素,只需要比較到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 + 1
i * 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 簡單來說就是插入乙個數,在結果裡找他插入的位置。位置怎麼...