js排序算法基礎--快速排序

快速排序

快速排序也是最經常使用的排序算法,和歸併算法同樣,快速排序也採用分治的方法,將原始數組分爲較小的數組。(可是並無像歸併排序那樣將它們分開)算法

思路:數組

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
}
相關文章
相關標籤/搜索