6、排序算法
6.1介绍与分类
排序算法:将一组数据依照指定的顺序(正序或倒序)进行排列的过程。
排序分类:
- 内部排序:将需要处理的一组待排序的数据,全部都加载到内部存储器(内存)中进行排序。
- 外部排序:再进行数据处理时,数据量过大时无法全部加载到内存中,需要借助外部存储(文件等)进行排序。
6.2 复杂度
6.2.1 时间复杂度
- 算法耗时对比
- 事后统计:需要运行程序,所得的结果依赖于计算机的硬件,软件等环境,需要在相同的状态下运行,才能进行对比。
- 事前估算:通过分析某个算法的时间复杂度来判断哪个算法更好。
- 时间频度:
一个算法花费的时间与算法中语句执行的次数成正比,记为时间频度。
- 忽略常数项
T(n)=2n+20 | T(n)=2*n | T(3n+10) | T(3n) | |
---|---|---|---|---|
1 | 22 | 2 | 13 | 3 |
2 | 24 | 4 | 16 | 6 |
5 | 30 | 10 | 25 | 15 |
8 | 36 | 16 | 34 | 24 |
15 | 50 | 30 | 55 | 45 |
30 | 80 | 60 | 100 | 90 |
100 | 220 | 200 | 310 | 300 |
300 | 620 | 600 | 910 | 900 |
- 忽略低次项
T(n)=2n^2+3n+10 | T(2n^2) | T(n^2+5n+20) | T(n^2) | |
---|---|---|---|---|
1 | 15 | 2 | 26 | 1 |
2 | 24 | 8 | 34 | 4 |
5 | 75 | 50 | 70 | 25 |
8 | 162 | 128 | 124 | 64 |
15 | 505 | 450 | 320 | 225 |
30 | 1900 | 1800 | 1070 | 900 |
100 | 20310 | 20000 | 10520 | 10000 |
- 忽略系数
T(3n^2+2n) | T(5n^2+7n) | T(n^3+5n) | T(6n^3+4n) | |
---|---|---|---|---|
1 | 5 | 12 | 6 | 10 |
2 | 16 | 34 | 18 | 56 |
5 | 85 | 160 | 150 | 770 |
8 | 208 | 376 | 552 | 3104 |
15 | 705 | 1230 | 3450 | 20310 |
30 | 2760 | 4710 | 27150 | 162120 |
100 | 30200 | 50700 | 1000500 | 6000400 |
- 时间复杂度
一般情况下,算法中的基本操作语句的重复执行次数时问题规模n的某个函数,用T(n)
表示,若有某个辅助函数f(n)
,使得当n趋近于无穷大时,T(n) / f(n)
的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作 T(n)=O( f(n) )
,称O( f(n) )
为算法的渐进时间复杂度,简称时间复杂度。
计算方法:以T(n)=n²+7n+6
为例:
忽略常数项,忽略低次项,忽略系数,最后复杂度:O(n²)
- 常见的时间复杂度
- 常数阶
O(1)
- 对数阶O(log2n)
- 线性阶O(n)
- 线性对数阶O(nlog2n)
- 平方阶O(n2)
- 立方阶O(n3)
- k次方阶O(nk)
- 指数阶O(2n)
O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(nk) < O(2n) < O(n!),随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低
6.2.2 空间复杂度
类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数。空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元。