快排之三路快排
Posted 三水草肃
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快排之三路快排相关的知识,希望对你有一定的参考价值。
快排的核心思想
排序数组中下标从 left 到 right 之间的一组数据,我们选择 left 到 right 之间的任意一个数据作为pivot(分区点),我们遍历 left 到 left之间的数据,将小于priot的放到左边,将大于pivot的放到右边,将pivot放到中间。经过这一步骤之后,数组 left 到 right 之间的数据就被分成了三个部分,前面 left 到 q-1 之间都是小于pivot,中间是pivot,后面 q+1 到 right 之间都是大于pivot
1. 大多数快排是这样写的,但是这样写有一个很大的问题是空间复杂度是O(n),当数据量很大的时候会耗费很大内存。
function quickSort(arr)
if (arr.length < 2)
return arr;
let leftArr = [];
let rightArr = [];
// midNum 作为分区的点,必须从数组中提出来。
// 因为是根据 midNum 进行分区的,首次会对 midNum 进行排序。
let midNum = arr.splice(Math.floor(arr.length / 2), 1)[0];
for (let i = 0; i < arr.length; i++)
if (arr[i] > midNum)
rightArr.push(arr[i]);
else
leftArr.push(arr[i]);
return quickSort(leftArr).concat(midNum, quickSort(rightArr));
2. 快排的正确写法
三路快排
function sortQuick(arr)
if (!arr || arr.length < 2) return arr;
return sort(arr, 0, arr.length - 1);
function sort(arr, left, right)
// 当 left 大于等于 right说明已经遍历一遍
if (left >= right) return;
// 数组排序
let less, great = sortPartion(arr, left, right);
// 对数组左边再次进行排序,不包括中间值,所以是0 - (less-1), (great+1) - right
sort(arr, 0, less - 1);
// 对数组右边再次进行排序
sort(arr, great + 1, right);
return arr;
// 此方法是把大的数放在右边,小的数放在左边
function sortPartion(arr, left, right)
let less = left;
let pivot = arr[right];
let great = right;
let start = left;
while(start <= great)
if(arr[start] < pivot)
[arr[less], arr[start]] = [arr[start], arr[less]];
start++;
less++;
else if(arr[start] > pivot)
[arr[start], arr[great]] = [arr[great], arr[start]];
great--;
else
// arr[start] > pivot, 放在中间不动
start++;
return
less,
great,
;
console.log(sortQuick([2, 4, 1, 5, 2, 3, 1, 34, 3, 5, 3, 1, 43]));
以上是关于快排之三路快排的主要内容,如果未能解决你的问题,请参考以下文章