时间复杂度和空间复杂度—选择排序

时间复杂度和空间复杂度的简述

时间复杂度
**定义:**每个算法都有自己的执行时间,但我们无法算出来,只能上机去测试。但不是所有的算法都去上机测试,我们只需要知道那个算法的循环次数少也就知道这个算法执行时间比较少,因此我们根据一个算法的循环次数去判断他的执行时间,也把这个循环次数叫做这个算法的时间复杂度。
常见的时间复杂度

常数阶O(1),

如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,
其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

对数阶O(log2 n),

线性阶O(n),

线性对数阶O(n log2 n),

平方阶O(n^2),

立方阶O(n^3)

k次方阶O(n^K),

指数阶O(2^n)。

其他时间复杂度都会随着n的变化慢慢变大,算法开销也越来越大	。

计算方法:

  1. 选取相对增长最快的项(因为计算时间复杂度都是考虑最坏的想法)。
  2. 最高项系数化为1。
  3. 若为常数则为O(1)复杂度。

空间复杂度
**定义:**空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度
计算方法:

  1. 常数,O(1)复杂度
  2. 递归算法的空间复杂度=递归深度N*每次递归所要的辅助空间
  3. 对于单线程来说,递归有运行时堆栈,求的是递归最深的那一次压栈所耗费的空间的个数,因为递归最深的那一次所耗费的空间足以容纳它所有递归过程。

下面根据选择排序计算它的时间复杂度和空间复杂度:

void Efferve()
{
 	int m[5] = { 12, 8, 6, 9, 10 };
	 int max = m[0];
	 for (int i = 0; i < 4; i++)
	 {
  		for (int j = i; j < 4; j++)
 		 {
 		 	 if (m[j] < m[j + 1])
  			 {
    				max = m[j + 1];
   				 m[j + 1] = m[j];
    				m[j] = max;
 			  }
 		 }
	 } 
}

上面的代码可以看出选择排序套用了两个循环如下:

 for (int i = 0; i < 4; i++)
  {
    for (int j = 0; j < 4; j++)
    {
    }
  }

当i=0下面循环4次,每次i+1下面循环都执行次4-i次,因此上述循环次数为T=T = (4-1))+ (4 -2)+(4 - 3)+ 1;T=[4*(4-1)]/2次
哪当N个数进行排序时,将进行T=[N*(N-1)]/2次,根据计算方法保留最高次N^2,因此选择排序的时间复杂度为O(N ^2);

因为排序中始终只用到了数组大小的空间,为常数,因此空间复杂度为O(1)。

如有什么意见请在下面评论,谢谢。

猜你喜欢

转载自blog.csdn.net/ly1196324806/article/details/107923609
今日推荐