前言
最近开始复习一点算法知识,而排序可以说是算法里的基础了,今天就让我带大家重温(xue xi)一下三大经典算法, 冒泡排序、插入排序、快速排序中的快速排序算法吧。
简介 (wiki 百科)
快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法,最早由东尼·霍尔提出。在平均状况下,排序
n
个项目要
O(n log n)
次比较。在最坏状况下则需要
O (n²)
次比较,但这种状况并不常见。事实上,快速排序
O(n log n)
通常明显比其他算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地达成。其实这是分治法与递归结合实现的。
思想
-
原数组中,取出中间值
-
原数组剩下的每一项与中间值比较,小的放左边,大的放右边并和中间项拼接
-
左右两边数组递归此函数
-
直到原数组只剩下一项或空,停止递归循环
实现快速排序
说了这么多,还是没有图片看起来更加直观呀,那么就请看下面这张图吧!
下面请看 js 代码实现
let array = [3, 2, 1, 6, 9, 7, 8, 5]
function quickSort (arr){
// 4 直到原数组只剩下一项或空
if(arr.length<=1){
return arr
}
// 1 原数组中,取出中间值
let middleIndex = Math.floor(arr.length/2)
let middleVal = arr.splice(middleIndex,1)[0]
// 2 原数组剩下的每一项与中间值比较,小的放左边,大的放右边并和中间项拼接
let leftArr = []
let rightArr = []
for (let i=0; i< arr.length; i++){
let item = arr[i]
item < middleVal ? leftArr.push(item) : rightArr.push(item)
}
// 3 左右两边数组递归此函数
return quickSort(leftArr).concat(middleVal,quickSort(rightArr))
}
console.log('quickSort(array): ', quickSort(array)); // [ 1, 2, 3, 5, 6, 7, 8, 9 ]
好了,希望今天的分享能让你有所收获,如果喜欢我的分享的话,请点赞收藏加转发,另外听说点赞的话代表朕已阅 呢
作者:陈有味
联系方式: chenuvi@outlook.com