zoukankan      html  css  js  c++  java
  • 6. 八大排序的效率及稳定性

    各排序算法的时空复杂度及稳定性
    类别 排序方法 平均时间复杂度 最坏时间复杂度 辅助空间 稳定性
    插入 直接插入排序 O(n2) O(n2) O(1) 稳定
    希尔排序 O(n1.3) O(n2) O(1) 不稳定
    选择 直接选择排序 O(n2) O(n2) O(1) 不稳定
    堆排序 O(nlogn) O(nlogn) O(1) 不稳定
    交换 冒泡排序 O(n2) O(n2) O(1) 稳定
    快速排序 O(nlogn) O(n2) O(nlogn) 不稳定
      归并排序 O(nlogn) O(nlogn) O(n) 稳定

    一、什么是排序算法的稳定性

    假设在数列中存在a[ i ] = a[ j ]。若在排序之前,a[ i ]在a[ j ]前面;并且排序之后,a[ i ]仍然在a[ j ]前面。则这个排序算法是稳定的!

    二、选择哪种排序算法

    (1)当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序。

    • 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短。
    • 堆排序:所需的辅助空间少于快速排序,并且不会出现快速排序可能出现的最坏情况。
    • 归并排序:它有一定数量的数据移动,所以我们可能要与插入排序组合,先获得一定长度的序列,然后再合并,在效率上将有所提高。

    (2)当n较大,内存空间允许,且要求稳定性 =》归并排序。 
    (3)当n较小,可采用直接插入或直接选择排序。

    • 直接插入排序:当元素分布有序时,直接插入排序将大大减少比较次数和移动记录的次数。
    • 直接选择排序 :元素分布有序,如果不要求稳定性,选择直接选择排序。

    (4)一般不使用或不直接使用传统的冒泡排序。

  • 相关阅读:
    FPGrowth 实现
    数据库事务的4个特性ACID
    redis简介(keeper实时报表的基本部分)
    HADOOP中的CRC数据校验文件
    潜在语义分析
    AdaBoost 算法
    cocosBuilder生成cbbi文件,绑定到cocos2d-x
    C++继承模型
    Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)
    从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
  • 原文地址:https://www.cnblogs.com/xzxl/p/9582332.html
Copyright © 2011-2022 走看看