本篇介绍下三路快速排序的实现,相对于上篇的现实,它在面对随机序列、有序序列和元素相等序列(序列中所有元素相等)时有着良好的性能。三路快速排序会分别对小于分界基准点(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);}