排序算法

1、算法分类:

十种常见排序算法可以分为两大类

线性时间较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。

非线性时间比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 


2、相关概念:

稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 

不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 

时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 

空间复杂度:是指算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数。


稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。


3、在排序算法中,我们可能会遇到In-place和Out-place

  • in-place 占用常数内存,不占用额外内存

  • out-place 占用额外内存

冷暖自知一抹茶ck

IN-PLACE

假如问题规模是n,在解决问题过程中,只开辟了常数量的空间,与n无关,这是原址操作,就是In-place。

举个例子:

/**
 * 冒泡排序
 * @param {Array} arr 传入一个数组,按照从小到大排序
 * @returns {Array} 返回排序后的数组
 */
let bubbleSort = (arr) => {
    let len = arr.length;
    let temp;
    for (let i = 0; i < len - 1; i++) {
        for (let j = 0; j < len - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    return arr;
};

在冒泡排序中,为了将arr排序,借用了一个temp的临时变量,开辟了一个临时空间,这个空间是常数量,这就是in-place。

OUT-PLACE

如果开辟的辅助空间与问题规模有关,则是out-place。

拿上面的例子来说,假设你把排序时把数组中的数按顺序放入了一个新的数组,我就开了一个n规模大小的数组,这个就与数据规模有关。


4、各种排序算法概要说明

  1. 插入排序:插入排序基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定的排序方法。插入排序的基本思想是:每步将一个待排序的纪录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

  2. 选择排序:选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。 

  3. 冒泡排序:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端。 

  4. 快速排序:快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

  5. 归并排序:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 

  6. 希尔排序:希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。


5、各种排序算法的时间、空间复杂度、稳定性对比分析

冷暖自知一抹茶ck




附:

    十大经典排序算法

    在线动画演示插入/选择/冒泡/归并/希尔/快速排序算法过程工具

    常用排序算法总结

    常用算法和数据结构的复杂度- bigocheatsheet.com

冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论