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、常见的时间复杂度
- 常数阶O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n2)
- 立方阶O(n3)
- k次方阶O(nk)
- 指数阶O(2n)
从上到下时间复杂度依次增大,因此要避免指数阶