常用排序算法的总结和对比

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: 占用额外内存;