zoukankan      html  css  js  c++  java
  • 13、排序算法-介绍

    来源:https://www.bilibili.com/video/BV1B4411H76f?p=39

    一、排序算法的分类

    1、内部排序

      即将数据加载到内部存储器中,之后进行排序。

      具体来说又可以分为以下几个常用的类

        a)插入排序:

          直接插入排序

          希尔排序

        b)选择排序:

          简单选择排序

          堆排序

        c)交换排序

          冒泡排序

          快速排序

        d)归并排序

        e)基数排序

    2、外部排序

      数据量过大,需要借助外部存储的帮助(文件、磁盘等)

    二、算法的时间复杂度

    1、时间频度

    时间频度指的是一个算法中语句的执行次数,一般用T(n)表示

    例如:

    1 int total = 0;
    2 int end = 100;
    3 for(int i = 0; i <= end;i++){
    4   total++;  
    5 }

    上面这个简单的代码要执行的次数与end有关,最终加起来T(n)=n+1

    这样的具体计算也可以用一行代码来完成

    1 tatal = (1 + end)*end/2;

    这样的话,时间频度就可以降低至T(n)=1,这里的计算次数与end没有关系了。

    由于时间频度的计算与一个变量有关,所有时间频度有如下特点:

      a)可以忽略常数项

      b)可以忽略低阶次项

      c)可以忽略系数

    2、时间复杂度

    已知算法的时间频度T(n),如果存在一个辅助函数f(n),当n趋近于无穷大时,T(n)/f(n)的比值如果是一个不为零的常数,那么我们称f(n)是一个与T(n)同数量级的函数。可以这样表示T(n)=O(f(n))。这里我们称O(f(n))为时间复杂度。

    存在这样的情况,时间频度T(n)不相同,而时间复杂度O(n)相同。

    例如:T(n)=n2+7n+6 与 T(n)=3n2+2n+2时间复杂度相同,为什么呢?

    因为,时间复杂度有一个计算方法:

    • 用1代替常数
    • 只保留高阶项
    • 去掉高阶项的系数

    因此,上述两个时间频度的时间复杂度O(n)=n2,或者简写为O(n2)

    3、常见的时间复杂度

    1. 常数阶O(1)
    2. 对数阶O(log2n)
    3. 线性阶O(n)
    4. 线性对数阶O(nlog2n)
    5. 平方阶O(n2)
    6. 立方阶O(n3)
    7. k次方阶O(nk)
    8. 指数阶O(2n)

    从上到下时间复杂度依次增大,因此要避免指数阶

  • 相关阅读:
    [转]22条经典的编程引言 朱燚:
    [转]Windbg的学习记录(一) 朱燚:
    C#7.0 模式匹配与if语句
    使用switch表达式简化switch语句
    .Net 5 在函数中使用Lambda
    MongoDB find getmore操作慢问题排查
    multikey索引和wildCard索引场景比较
    一个高性能跨平台基于Python的Waitress WSGI Server的介绍!
    郁闷的一天!
    互联网项目管理要点
  • 原文地址:https://www.cnblogs.com/zhao-xin/p/13158607.html
Copyright © 2011-2022 走看看