zoukankan      html  css  js  c++  java
  • 常见的排序算法——总结(待完成)

    最近总结了以下排序算法:

    1. 插入排序:直接插入排序,希尔排序
    2. 交换排序:冒泡排序,快速排序(挖坑法,前后指针法,左右指针法)
    3. 选择排序:直接选择排序,堆排序
    4. 归并排序

    所以想对这些排序算法再做一个对比。

    一、理论值对比

    (参考:https://www.cnblogs.com/angelye/p/7508292.html 这篇总结了各种排序算法的实现思想,也是我自己需要完善的地方)

    排序法

    最差时间分析 平均时间复杂度 稳定度 空间复杂度
    冒泡排序 O(n2) O(n2) 稳定 O(1)
    快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n)
    选择排序 O(n2) O(n2) 不稳定 O(1)
    二叉树排序 O(n2) O(n*log2n) 不一顶 O(n)

    插入排序

    O(n2) O(n2) 稳定 O(1)
    堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)
    希尔排序 O O 不稳定 O(1)

    (希尔排序可以参考这篇:http://www.cnblogs.com/skywang12345/p/3597597.html)

    二、运行时间对比

    归并排序:O(nlog2n)

    实验了各种排序算法需要的运行时间:

    2000个元素时:

     20000个元素时:

    50000个元素时:

    100000个元素时:

     

    从上面结果可以看出:直接插入排序(direct_insert)、直接选择排序(select_direct)、冒泡排序(bubble)耗时随着数据量的增加,耗时增加的非常快。

    接下来,我们再来对比其他几种排序算法的耗时:

    200000个元素:

    500000个元素:

    1000000个元素: 

     

    2000000个元素:

    10000000个元素:

    从上面的结果可以看出来:快速排序(挖坑法,前后指针法,左右指针法)的耗时最少,归并排序(merge)其次,堆排序(heap)和希尔排序(shell)最多。

    结论:一般来说,当数据规模较小时,应该选择直接插入排序或冒泡排序。快速排序是一种不稳定的排序,但是对于大部分已经排好的数据,快速排序会浪费大量不必要的步骤。快速排序适用于大量随机数据的情况。

  • 相关阅读:
    以太坊设计原理
    Merkle Patricia Tree 详解
    Verifiable random function
    压缩工具gzip、bzip2、xz的使用
    压缩工具gzip、bzip2、xz的使用
    Jni中图片传递的3种方式(转)
    Jni中图片传递的3种方式(转)
    短视频sdk:选择一个靠谱的短视频SDK 你需要了解这些
    短视频sdk:选择一个靠谱的短视频SDK 你需要了解这些
    短视频sdk:选择一个靠谱的短视频SDK 你需要了解这些
  • 原文地址:https://www.cnblogs.com/Brickert/p/10775980.html
Copyright © 2011-2022 走看看