快速排序也是最經常使用的排序算法,和歸併算法同樣,快速排序也採用分治的方法,將原始數組分爲較小的數組。(可是並無像歸併排序那樣將它們分開)算法
思路:數組
1.從數組中選擇中間一項做爲主元;ui
2.建立兩個指針,左邊一個指向數組的第一項,右邊指向數組最後一項。移動左指針直到咱們找到一個比主元大的元素,接着,移動右指針直到找到一個比主元小的元素。而後交換它們,重複這個過程,直到左指針超過了右指針。這個過程是的比主元小的值都排在了主元以前,而比主元大的值都排在了主元以後,這一步叫劃分操做。spa
3.接着,算法對劃分的小數組(較主元小的值組成的子數組,以及較主元大的值組成的子數組)重複以前的兩個步驟,直至數組以徹底排序。指針
注意:劃分的依據是根據指定的主元來進行的。選擇主元有好幾種方式,最簡單的是選擇第一項。然而研究代表對於幾乎已排序的數組來講,這不是一個好的選擇,它會致使該算法最差的表現,因此另外一種方式是隨機選擇一個數組項或者是選擇中間項。code
function quickSort(array){ quick(array, 0, array.length-1); } function quick(array, left, right){ var index; if(array.length > 1){ // 返回每次劃分後的左指針的位置 index = partition(array, left, right); if(left < index - 1){ quick(array, left, index - 1) } if(index < right){ quick(array, index, right) } } } // 劃分過程 function partition(array, left, right){ // 選擇數組中間項做爲主元 // 定義左右兩個指針 var pivot = array[Math.floor(right + left) / 2], i = left, j = right; // 當左邊指針超過右邊指針時結束循環 while(i <= j){ // 移動左指針找到一個大於等於主元的項,而後中止移動左指針 while(array[i] < pivot){ // 若沒有找到就移動左指針 i++ } // 移動右指針找到一個小於等於主元的項,而後中止移動右指針 while(array[j] > pivot){ // 若沒有找到就移動右指針 j-- } // 左右指針中止後,判斷兩個指針的位置, if(i <= j){ // 若左指針沒有超過右指針,交換兩項的值,並移動兩個指針 swap(array, i, j); i++; j--; } } // 返回左指針用來建立子數組 // 當一次循環結束後,比主元小的項所有在主元的左側 return i }