day13 JS引擎如何实现数组的稳定排序?

在数据结构中,我们大体可以分为两类。第一类是线性表,第二类是非线性表。
数组可以说是一种连续存储的线性表;通过数组,我们可以实现比如之前说过的栈、队列等线性结构。
除了数组以外,另外一种既基础又经典的数据结构就是对象了。

  1. 对象的一个特点是含有属性
  2. 另外一个特点是它支持键值对(key-value pair)
    数组的优劣势是什么
    数组作为一种线性数据结构最大的特点是连续性,带来的优势是可随机访问性,但是它的劣势是高效的插入和删除。
    数组的劣势是插入和删除,我们假设在排队的时候,有人插队,那么整个组的人都会往后移动。
    在数组中,如果把数据元素插到队尾的话,那么整个时间复杂度仅仅为 O(1)。
    JS 如何实现数组的排序
    其中前 2 种冒泡和选择排序是偏理论型的排序方式,后面 3 种,插入、快排和归并属于应用型的算法。Chrome 用的 V8 引擎就是快排和插入排序的结合,火狐用的 SpiderMonkey 则是基于归并来实现排序的。
    day13 JS引擎如何实现数组的稳定排序?_第1张图片
    理论类排序法
    冒泡、选择这两种排序算法:这两种方式用的都是一种比较和交换的方法(compare and swap)。
    冒泡排序(bubble sort):核心思想就是通过比较两个相邻的数据元素,如果前面的大于后面的,就交换它们的位置。
    选择排序(selection sort):它的核心思想就是找到最小的数据元素,把它放到第一位,然后再从剩下的数组中找到最小的数据元素,然后放到第二位,以此类推。
    常用类排序法
    插入排序(insertion sort)和之前的冒泡和选择排序法不同,它不是用比较和交换,而是通过位移来做插入。
    归并排序(merge sort)可以算是比较常见的应用型排序算法了,它的复杂度是 O(nlogn)。
    排序的稳定性问题
    在 ECAMScript 的官方文档中,虽然并不指定 JS 引擎对 sort 的具体实现方式,但是有一条准则,就是要确保数组的排序必须是稳定排序(stable sort)。
    从理论上讲,虽然归并和快排的复杂度都是相同的,但是前面我们忽略了两个重要因素,第一个是时间复杂度的平均和极端情况,第二个是空间复杂度的问题。快排在平均情况下的空间复杂度是 O(nlogn),但是在极端情况下是 O(n2)。
    线性类排序法
    还有一类的排序法我们称之为线性排序法,因为他们使用的都是非比较类的排序方法,这里包括了计数、桶和基数排序,因为这几种排序算法都是用于特殊场景。

你可能感兴趣的:(前端javascript)