JavaScript 没有显式的栈数据结构,但是数组支持 push()
和 pop()
函数。但是不支持 peek()
函数,所以必须用 stack [stack.length-1]
手动检查栈顶。
我们将使用与递归方法相同的“分区”功能。看看如何编写Quicksort部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
以下是测试代码:
1 2 3 4 |
|
输出:
1 |
|
可视化演示
当涉及到排序算法时,将其可视化能帮我们直观的了解它们是怎样运作的,下面这个例子搬运自维基百科:
在图中也把最后一个元素作为基准。给定数组分区后,递归遍历左侧,直到将其完全排序为止。然后对右侧进行排序。
快速排序的效率
现在讨论它的时间和空间复杂度。快速排序在最坏情况下的时间复杂度是 $O(n^2)$。平均时间复杂度为 $O(n\log n)$。通常,使用随机版本的快速排序可以避免最坏的情况。
快速排序算法的弱点是基准的选择。每选择一次错误的基准(大于或小于大多数元素的基准)都会带来最坏的时间复杂度。在重复选择基准时,如果元素值小于或大于该元素的基准时,时间复杂度为 $O(n\log n)$。
根据经验可以观察到,无论采用哪种数据基准选择策略,快速排序的时间复杂度都倾向于具有 $O(n\log n)$ 。
快速排序不会占用任何额外的空间(不包括为递归调用保留的空间)。这种算法被称为in-place算法,不需要额外的空间。
更多编程相关知识,请访问:编程入门!!
以上就是深入浅析JavaScript中的快速排序的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
更多相关阅读请进入《前端》频道 >>

Vue.js 设计与实现 基于Vue.js 3 深入解析Vue.js 设计细节
本书对 Vue.js 3 技术细节的分析非常可靠,对于需要深入理解 Vue.js 3 的用户会有很大的帮助。——尤雨溪,Vue.js作者