快速排序
基本思想
快速排序和归并排序一样,也使用了分而治之的方法,将原始数组分为较小的数组。但是实现方式与归并排序并不一样。
基本思路
- 找基准值:找到数组中间的那个值做为基准值。
- 划分:循环数组,比基准值小的存储在左数组,大的存储在由数组。
- 继续第一步和第二步,排序完成合并左数组,基准值和右数组。
代码实现
let arr = [3,1,5,2,4,6,8]
var quickSort = function (arr) {
if (arr.length <= 1) {
return arr;
}
let pivotIndex = Math.floor(arr.length / 2); // 找到基准值索引
let pivot = arr.splice(pivotIndex, 1)[0]; // 找到基准值并从原数组中移除
let left = []; // 存储比基准值小的值
let right = []; // 存储比基准值大的值
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right)); // 合并左数组,主元和右数组
};
console.log(quickSort(arr));
性能
快速排序的复杂度为O(nlog(n)),且性能通常比其他复杂度为O(nlog(n))的排序算法要好。