深入浅析JavaScript中的快速排序


当前第2页 返回上一页

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

function quickSortIterative(arr) {

    // 用push()和pop()函数创建一个将作为栈使用的数组

    stack = [];

     

    // 将整个初始数组做为“未排序的子数组”

    stack.push(0);

    stack.push(arr.length - 1);

     

    // 没有显式的peek()函数

    // 只要存在未排序的子数组,就重复循环

    while(stack[stack.length - 1] >= 0){

         

        // 提取顶部未排序的子数组

        end = stack.pop();

        start = stack.pop();

         

        pivotIndex = partition(arr, start, end);

         

        // 如果基准的左侧有未排序的元素,

        // 则将该子数组添加到栈中,以便稍后对其进行排序

        if (pivotIndex - 1 > start){

            stack.push(start);

            stack.push(pivotIndex - 1);

        }

         

        // 如果基准的右侧有未排序的元素,

        // 则将该子数组添加到栈中,以便稍后对其进行排序

        if (pivotIndex + 1 < end){

            stack.push(pivotIndex + 1);

            stack.push(end);

        }

    }

}

以下是测试代码:

1

2

3

4

ourArray = [7, -2, 4, 1, 6, 5, 0, -4, 2]

quickSortIterative(ourArray)

 

console.log(ourArray)

输出:

1

-4,-2,0,1,2,4,5,6,7

可视化演示

当涉及到排序算法时,将其可视化能帮我们直观的了解它们是怎样运作的,下面这个例子搬运自维基百科:

2.gif

在图中也把最后一个元素作为基准。给定数组分区后,递归遍历左侧,直到将其完全排序为止。然后对右侧进行排序。

快速排序的效率

现在讨论它的时间和空间复杂度。快速排序在最坏情况下的时间复杂度是 $O(n^2)$。平均时间复杂度为 $O(n\log n)$。通常,使用随机版本的快速排序可以避免最坏的情况。

快速排序算法的弱点是基准的选择。每选择一次错误的基准(大于或小于大多数元素的基准)都会带来最坏的时间复杂度。在重复选择基准时,如果元素值小于或大于该元素的基准时,时间复杂度为 $O(n\log n)$。

根据经验可以观察到,无论采用哪种数据基准选择策略,快速排序的时间复杂度都倾向于具有 $O(n\log n)$ 。

快速排序不会占用任何额外的空间(不包括为递归调用保留的空间)。这种算法被称为in-place算法,不需要额外的空间。

更多编程相关知识,请访问:编程入门!!

以上就是深入浅析JavaScript中的快速排序的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript是不是弱语言

javascript有哪些不同版本

javascript如何删除指定数组元素

js对象基础知识的巩固学习笔记

javascript如何判断对象是否数组

javascript事件捕获与事件冒泡

javascript怎么对url进行编码转换

node.js fs是什么

使用proxy实现双向绑定的方法介绍(代码)

javascript怎么实现鼠标追随

更多相关阅读请进入《前端》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...