算法笔记系列:快速排序(优化)

Posted JavaScript开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法笔记系列:快速排序(优化)相关的知识,希望对你有一定的参考价值。

快速排序
本篇介绍下三路快速排序的实现,相对于上篇的现实,它在面对随机序列、有序序列和元素相等序列(序列中所有元素相等)时有着良好的性能。三路快速排序会分别对小于分界基准点(p)、等于p、大于p的元素做相应的处理(对小于、大于基准点的部分进行递归排序),具体如下:

算法笔记系列:快速排序(优化)
(排序完成时,i与gt的位置相重叠)
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, // 小于p部分的最后1个元素的索引 gt = r + 1, // 大于p部分的第1个元素的索引 i = l + 1; // 遍历所用索引
// 当 i 与 gt 的位置未重叠时 while (i < gt) { // 如果当前元素小于p,则交换arr[i]与当前lt + 1处元素的位置 if (arr[i] < arr[l]) { lt++; _swap(arr, i, lt); i++; }     // 如果当前元素大于p,则交换arr[i]与当前gt - 1处元素的位置 else if (arr[i] > arr[l]) { gt--; _swap(arr, i, gt); }    // 如果当前元素等于p,i++(即等于p部分中的元素+1) else { i++; } }
  // 完成本次排序前,交换p与小于p部分的最后1个元素 _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);}


以上是关于算法笔记系列:快速排序(优化)的主要内容,如果未能解决你的问题,请参考以下文章

[ 数据结构 -- 手撕排序算法第五篇 ] 快速排序 <包含hoare法,挖坑法,前后指针法> 及其算法优化

学习数据结构笔记====>不同的排序算法(Sort Algorithm)[冒泡,选择,插入,快速,希尔,基数,归并]

java代码[No.4]—快速排序算法的三种方式及其优化

算法笔记 | 快速排序的代码实现和复杂度分析

算法系列01:快速排序&&归并排序

算法笔记系列:希尔排序