快速排序
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個專案要O(n*logn)次比較。在最壞狀況下則需要O(n2)次比較,但這種情況並不常見。事實上,快速排序通常明顯比其他O(nlogn)演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上有效地被實現出來。
快速排序使用分治法策略來把一個數列分為兩個子數列。
演算法步驟:
-
從數列中挑出一個元素,稱為 "基準"(pivot),
-
重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分割槽退出之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
-
遞迴地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。 遞迴的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞迴下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
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實現