Live2D
Fork me on GitHub

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)

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

posted @ 2020-06-18 17:15  -小二黑-  阅读(181)  评论(0编辑  收藏  举报