xw1181

时间:2020-10-20 21:36:57

作者:whimouse

排序算法

稳定性:

  指排序后原有数列中相同值的元素相对次序是否发生改变,若不改变,则是稳定的。

稳定性算法的好处:

  若一个排序算法稳定,那么上一趟排序的结果往往可以被下一趟使用。

  另外若是稳定,可以避免多余的比较或移动。

具体算法实现代码见数据结构类别

插入排序

1. 直接插入——快而简单的排序

定义:
    桶排序,也叫箱排序。知道待排序元素范围,需要在这个范围内的同样多的同然后把元素放进桶按序输出。

2. 希尔排序——直接插入的改进:

定义:也叫缩小增量排序
    使用增量的方式改进插入排序,内部还是使用插入排序进行处理。

选择排序

1. 简单选择——简单:

定义:
    可分为两部分,一部分是选择待排序中最小(或最小)的一个元素,与第一个元素进行交换,接着在剩余元素里寻找最小(或最大)的一个数,与第二个元素交换。一次类推,直到待排序数列中只有一个元素是为止。

2. 堆排序:

  利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

交换排序

1. 冒泡排序:


    定义:
        重复走访待排序数列,一次走访两个元素。
    原理:
        用一个数组来存放待排序数列;
        1.从尾部开始比较两个相邻元素,若尾部元素大则交换元素位置,
        2.往前对每个相邻元素都做这样的比较、交换操作。这样到数组头部会产生最大的元素。
        3.重新从尾部开始12操作,除了在之前已经排好的元素。
        4.继续对越来越少的数据进行比较、交换,

2. 快速排序——最常用的排序:



        通过一趟排序将待排序数列分成独立的两部分,一部分的所有数据比另一部分的所有数据都小,再按这种方法对这两部分数据分别进行快速排序。整个过程可以递归进行。

各个排序复杂度分析:

类别

排序方法

时间复杂度

空间复杂度

稳定性

平均

最好

最坏

辅助空间

插入排序

直接插入

O(N^2)

O(N)

O(N^2)

O(1)

稳定

希尔排序

O(N^1.3)

O(N)

O(N^2)

O(1)

不稳定

选择排序

简单选择

O(N^2)

O(N^2)

O(N^2)

O(1)

不稳定

堆排序

O(NlogN)

O(NlogN)

O(NlogN)

O(1)

不稳定

交换排序

冒泡排序

O(N^2)

O(N)

O(N^2)

O(1)

稳定

快速排序

O(NlogN)

O(NlogN)

O(NlogN)

O(logN)

不稳定

 

 

 借鉴文章:

  1. 堆排序:详见:https://baike.baidu.com/item/堆排序

  2. 数据结构学习书籍:《轻松学算法互联网算法面试宝典》作者:赵烨

稳定性:

指排序后原有数列中相同值的元素相对次序是否发生改变,若不改变,则是稳定的。

稳定性算法的好处:

若一个排序算法稳定,那么上一趟排序的结果往往可以被下一趟使用。

 

另外若是稳定,可以避免多余的比较或移动。

插入排序

1. 直接插入:

定义:
    桶排序,也叫箱排序。知道待排序元素范围,需要在这个范围内的同样多的同然后把元素放进桶按序输出。

2. 希尔排序:

定义:也叫缩小增量排序
    使用增量的方式改进插入排序,内部还是使用插入排序进行处理。

选择排序

1. 简单选择:

定义:
    可分为两部分,一部分是选择待排序中最小(或最小)的一个元素,与第一个元素进行交换,接着在剩余元素里寻找最小(或最大)的一个数,与第二个元素交换。一次类推,直到待排序数列中只有一个元素是为止。

2. 堆排序:

利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

详见:https://baike.baidu.com/item/堆排序

交换排序

1. 冒泡排序:


    定义:
        重复走访待排序数列,一次走访两个元素。
    原理:
        用一个数组来存放待排序数列;
        1.从尾部开始比较两个相邻元素,若尾部元素大则交换元素位置,
        2.往前对每个相邻元素都做这样的比较、交换操作。这样到数组头部会产生最大的元素。
        3.重新从尾部开始12操作,除了在之前已经排好的元素。
        4.继续对越来越少的数据进行比较、交换,

2. 快速排序:



        通过一趟排序将待排序数列分成独立的两部分,一部分的所有数据比另一部分的所有数据都小,再按这种方法对这两部分数据分别进行快速排序。整个过程可以递归进行。

类别

排序方法

时间复杂度

空间复杂度

稳定性

平均

最好

最坏

辅助空间

插入排序

直接插入

O(N^2)

O(N)

O(N^2)

O(1)

稳定

希尔排序

O(N^1.3)

O(N)

O(N^2)

O(1)

不稳定

选择排序

简单选择

O(N^2)

O(N^2)

O(N^2)

O(1)

不稳定

堆排序

O(NlogN)

O(NlogN)

O(NlogN)

O(1)

不稳定

交换排序

冒泡排序

O(N^2)

O(N)

O(N^2)

O(1)

稳定

快速排序

O(NlogN)

O(NlogN)

O(NlogN)

O(logN)

不稳定

 

各个排序复杂度分析:

 

相关文章: