常用排序算法的总结和对比
1.算法简介
算法是满足输入,输出,确定性,有限性,正确性(/可行性)等性质的指令序列
- 输入:有零个或者多个外部量作为算法的输入;
- 输出:算法产生至少一个量作为输出;
- 确定性:组成算法的每条指令应该清晰,无歧义;
- 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的;
- 正确性/可行性:的确可以解决指定的问题;
2.算法的用途
算法是用来设计并实现一种用计算机来解决问题的方法
3.算法的复杂度
3.1.算法的时间复杂度
3.1.1.度量一个程序(算法)执行时间的两种方法
3.1.1.1.事后统计的方法
在算法(/程序)中添加加一个计时器,让算法(/程序)在电脑上先运行一次,可以知道算法的运行时间,这种方法可行,但是有两个问题:
- 要想对设计的算法的运行性能进行评测,需要实际运用该程序;
- 由于所得时间的统计量依赖于计算机的硬件、软件等环境因素,因此这种方式要在同一台计算机的相同状态下运行,才能比较哪个算法速度更快;
3.1.1.2.事前估算的方法
通过分析某个算法的时间复杂度
来判断哪个算法更优;
3.1.2.时间频度
1>.一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多.一个算法中的语句执行次数称为语句频度或时间频度,记为T(n);
2>.时间频度T(n)举例说明①.常数项可以忽略
例如:2n+20,2n,3n+10,3n;
因为常数项是固定不变的,对整个结果起不到关键性作用,所以我们只要比较前面系数项即可(2n,3n);
②.低次项可以忽略
例如:2n2+3n+10,2n2,n2+5n+20,n2;
因为低次项和常数项是对整个结果影响并不大,所以我们只要比较前面最高次项即可(n2,2n2);
③.系数可以忽略
例如: 3n2+2n,5n2+7n,n3+5n,6n3+4n;
因为低次项和系数(变量前面数字)是对整个结果影响并不大,所以我们只要比较次数最高的项即可(n3,n2);
3.1.3.时间复杂度
1>.一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)是T(n)的同数量级函数,记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度;
2>.T(n)不同,但时间复杂度可能相同.如:T(n)=n2+7n+6 与 T(n)=3n2+2n+2,它们的T(n)不同,但时间复杂度相同,都为O(n2);
3>.计算时间复杂度的方法
①.用常数1代替运行时间中的所有加法常数,如T(n)=n2+7n+6 => T(n)=n2+7n+1;
②.修改后的运行次数函数中,只保留最高阶项,如T(n)=n2+7n+1 => T(n) = n2;
③.去除最高阶项的系数,如T(n) = n2 => T(n) = n2 => O(n2);
3.1.4.常见时间复杂度
注意:常见的算法时间复杂度由小到大依次为:O(1) < O(log2n) < O(n) < O(nlog2n) < O(n2) < O(n3) < O(nk) < O(2n)随着问题规模n的不断扩大,上述时间复杂度不断增大,算法的执行效率越低;我们应该尽量避免使用指数阶的算法!
3.1.5.平均时间复杂度和最坏时间复杂度
①.平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间;
②.最坏情况下的时间复杂度称最坏时间复杂度.一般讨论的时间复杂度均是最坏情况下的时间复杂度.
这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长;
3.2.算法的空间复杂度[一般不考虑]
1>.类似于时间复杂度的讨论,一个算法的空间复杂度(Space Complexity)定义为该算法所耗费的存储空间,它也是问题规模n的函数;
2>.空间复杂度(Space Complexity)是对一个算法在运行过程中临时占用存储空间大小的量度.有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法,基数排序就属于这种情况;
3>.在做算法分析时,主要讨论的是时间复杂度.从用户使用体验上看,更看重的程序执行的速度.一些缓存产品(redis, memcache)和算法(基数排序)本质就是用空间换时间;
4.常用排序算法总结和对比
- 说明:
- 稳定: 如果元素a原本在元素b前面,而 a=b,排序之后,元素a仍然在元素b的前面;
- 不稳定: 如果元素a原本在元素b的前面,而a=b,排序之后,元素a可能会出现在元素b的后面;
- 内排序: 所有排序操作都在内存中完成;
- 外排序: 由于数据(量)太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
- 时间复杂度: 一个算法执行所耗费的时间;
- 空间复杂度: 运行完一个程序所需内存的大小;
- n: 数据规模(数据量);
- k: "桶(容器)"的个数,一般是10个;
- In-place: 不占用额外内存;
- Out-place: 占用额外内存;