排序算法

介绍

排序也称为排序算法
排序是将一组数据,按照指定的顺序进行排列的过程

排序的分类

  • 1.内部排序
    指将需要处理的所有数据都加载到内部存储中进行排序。
  • 2.外部排序
    数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
  • 3.常见的排序算法分类:

算法的时间复杂度

  • 1.事后统计法
    这种方法可行,但是有两个问题:一是要想对设计的算法的运行性性能进行评测,需要实际运行该程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,这种方式,要在同一台计算机的相同状态下运行,才能比较出来那个算法速度更快。

    1. 事前估算的方法
      通过分析某个算法的时间复杂度来判断那个算法更优。

时间频度

一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行的次数多,它花费的时间就多。一个算法中的语句执行次数成为语句频度或者时间频度。

案例

计算1-100所有的数字之和,我们设计两种算法

这种是T(n)=n+1

这种是T(n)=1

时间复杂度

  • 1.一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称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(n*2)
  • 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(n*2)

常见的时间复杂度

  • 1常数阶O(1)
  • 2.对数阶O(log2n)
  • 3.线性阶O(n)
  • 4.线性对数阶O(nlog2n)
  • 5.平方阶O(n*2)
  • 6.立方阶O(n*3)
  • 7.立方阶O(n*k)
  • 8.立方阶O(2*n)

    说明:
  • 1.常见的算法时间复杂度由小到大依次为:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<O(nk)<O(2n),随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
  • 2.我们应该尽可能避免使用指数阶的算法。

常数阶O(1)

无论多少行代码,只要没有循环等复杂结构,那这个代码的时间复杂度就是O(1)

对数阶O(log2n)


在while循环里面,每次都将i乘以2,乘完之后,i距离n就越来越近了,假设循环x次以后,i就大于2,此时退出循环。也就是说2的x次方等于n,那么x=log2n,也就是说当循环log2n次以后,这个代码就结束了,因此这个代码的时间复杂度为O(log2n)。如果i=3,那么O(log3n)。

线性阶O(n)

for循环里面的代码会执行n遍,因此它消耗的时间是随着n的变化而变化的,因此这类代码的时间复杂度就是O(n)

线性对数阶O(nlog2n)

将时间复杂度为O(log2n)的代码循环n遍,那时间复杂度就是O(nlog2n)

平方阶O(n*2)

双层for循环,就是平方阶

平均时间复杂度和最坏时间复杂度

平均时间复杂度

所有可能的输入实例均以等概率出现的情况下,该算法的运行时间。

最坏时间复杂度

最坏情况下的时间复杂度是算法在任何输入实例上运行时间的界限,这就保证了算法的运行时间不会比最坏情况更长。

空间复杂度

  • 1.一个算法的空间复杂度定义为该算法所耗费的存储空间,它也是问题规模n的函数
  • 2.空间复杂度,是对一个算法在运行过程中临时占用存储空间大小的量度,有的算法需要占用的临时工作单元数与解决问题的规模n有关,它随着n的增大而增大,当n较大时,将占用较多的存储单元,例如快速排序和归并排序算法属于这种情况。
  • 3.在做算法分析时,主要讨论的是时间复杂度,从用户使用体验上来看,更看重的是程序执行的速度,一些缓存产品(redis,memcache)和算法(基数排序)本质就是用空间换时间。
posted @ 2023-06-01 08:53  King-DA  阅读(28)  评论(0)    收藏  举报