本篇介绍下三路快速排序的实现,相对于上篇的现实,它在面对随机序列、有序序列和元素相等序列(序列中所有元素相等)时有着良好的性能。三路快速排序会分别对小于分界基准点(p)、等于p、大于p的元素做相应的处理(对小于、大于基准点的部分进行递归排序),具体如下:
function quickSort(arr) {
_sort(arr, 0, arr.length - 1);
}
function _sort(arr, l, r) {
if (l >= r) return;
var p = _random(l, r);
_swap(arr, l, p);
var lt = l,
gt = r + 1,
i = l + 1;
while (i < gt) {
if (arr[i] < arr[l]) {
lt++;
_swap(arr, i, lt);
i++;
}
else if (arr[i] > arr[l]) {
gt--;
_swap(arr, i, gt);
}
else {
i++;
}
}
_swap(arr, l, lt);
_sort(arr, l, lt - 1);
_sort(arr, gt, r);
}
function _swap(arr, i, j) {
var t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
function _random(from, to) {
return Math.floor(Math.random() * (to - from + 1) + from);
}