搞定JavaScript演算法系列--快速排序

上古神鵬發表於2019-04-16

搞定JavaScript演算法系列--快速排序

快速排序

快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個專案要O(n*logn)次比較。在最壞狀況下則需要O(n2)次比較,但這種情況並不常見。事實上,快速排序通常明顯比其他O(nlogn)演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上有效地被實現出來。

快速排序使用分治法策略來把一個數列分為兩個子數列。

演算法步驟:

  1. 從數列中挑出一個元素,稱為 "基準"(pivot),

  2. 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。

  3. 遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。

搞定JavaScript演算法系列--快速排序
JavaScript實現

var arr = [5,0,6,1,2,7,9,3,4,5,10,8];

function quickSort(arr) {
    var temArr = arr.slice(0);
    var pivot = temArr.splice(0, 1);
    var leftArr = [],
        rightArr = [];
    if(arr.length <= 1) {
        return arr;
    }
    for(var i=0;i<temArr.length;i++) {
        if(temArr[i] <= pivot) {
            leftArr.push(temArr[i]);
        }else {
            rightArr.push(temArr[i]);
        }
    }
    return quickSort(leftArr).concat(pivot, quickSort(rightArr));
}
複製程式碼

更加詳細介紹可參考快速排序(Quicksort)的Javascript實現

相關文章