当前位置:   article > 正文

排序算法:时间复杂度和空间复杂度_c#排序算法的时间复杂度,空间复杂度

c#排序算法的时间复杂度,空间复杂度

1,常见的排序分类

  • 排序算法分为内部排序和外部排序两种,内部排序是完全在内存中完成,外部排序需要使用外部介质,如硬盘,中间件等,此次排序算法只考虑内部排序
  • 内部排序算法可分为:插入排序(直接插入排序,希尔排序),选择排序(简单选择排序,堆排序),交换排序(冒泡排序,快速排序),归并排序,基数排序等

2,时间复杂度

  • 时间频度:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句的执行次数多,它花费的时间就多。一个算法中语句的执行次数称为语句频度或者时间频度,记为T(n)。在数量及运算下,时间频度公式的常量项,低次方项,以及系数项都是可以忽略的,时间频度的悬殊差距由高次方决定

2.1,时间复杂度基本介绍

  • 一般情况下,算法中的基本操作语句的重复执行次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大的时候,T(n)/f(n)的极限值不等于零的情况,则称f(n)T(n)的同数量级函数,记做T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度
  • 时间复杂度算法
    • 用常数1代替运行时间中的所有加法常数,为了区别出O(1)
    • 修改后的运行次数函数中,只保留最高阶项
    • 去除最高阶项的系数

2.2,常见的时间复杂度

  1. 常数阶O(1):无论代码执行了多少行,只要没有循环复杂结构,那么这个的时间复杂度就是O(1)
/**
 * O(1) 时间复杂度
 * 没有循环结构的顺序执行, 无论执行多少行, 时间复杂度均为O(1)
 */
public static void o1() {
	int i = 0;
	int j = 0;
	i++;
	j++;
	System.out.println(i + j);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 对数阶O(log2n)
/**
 * O(log2n) 时间复杂度
 * 此处 i 以二倍的速度增长, 也就是说到 2^n 后趋近于count, 整个过程执行log2n次
 */
public static void log2n(int count) {
	for (int i = 1; i <= count; i *= 2);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 线性阶O(n)
/**
 * O(n) 线性阶, 即代码循环次数随count的变化成线性变化
 */
public static void n(int count) {
	for (int i = 0; i < count; i++) {
		System.out.println(i);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  1. 线性对数阶O(nlog2n):线性阶与对数阶的嵌套
/**
 * O(nlog2n) 线程对数阶, 线性阶与对数阶的嵌套
 */
public static void nlog2n(int count) {
	// 线性阶
	for (int i = 0; i < count; i++) {
		// 对数阶
		int j = 0;
		while (j < count) {
			j *= 2;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. 平方阶O(n^2):双层线性循环嵌套
/**
 * O(n2) 平方阶, 就是双层线性循环嵌套
 */
public static void n2(int count) {
	// 线性阶
	for (int i = 0; i < count; i++) {
		// 线性阶
		for (int j = 0; j < count; i++) {
			System.out.println(i + j);
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. 立方阶O(n^3):三层线性循环嵌套
/**
 * O(n3) 立方阶, 就是三层线性循环嵌套
 */
public static void n3(int count) {
	// 线性阶
	for (int z = 0; z < count; z++) {
		// 线性阶
		for (int i = 0; i < count; i++) {
			// 线性阶
			for (int j = 0; j < count; j++) {
				System.out.println(z + i + j);
			}
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  1. K次方阶O(n^k):参考二阶和三阶,即K次的线程循环嵌套
  2. 指数阶O(2^n)
  3. 算法复杂度的优先级顺序

O(1) < O(log2n) < O(n) < O(nlog2n) < O(n^2) < O(n^3) < O(n^k) < O(2^n)

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

  • 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,该算法的运行时间
  • 最坏时间复杂度是最快情况下的时间复杂度,也是一般讨论的时间复杂度。是指任何输入实例的运行时间上限,这样保证算法时间不会比最坏情况更长
  • 平均时间复杂度与最坏时间复杂度是否一致,主要参考算法
    在这里插入图片描述

3,空间复杂度

  • 空间复杂度是指一个算法所耗费的存储空间,也是问题规模n的函数
  • 空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。有的算法需要占用的临时工作单元数与解决问题的规模n有关,随着n的增大而增大,当n较大时,将占用较多的存储单元,比如快速排序和归并排序、基数排序等
  • 在做算法分析时,主要讨论的是时间复杂度,用空间换时间
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/508155
推荐阅读
相关标签
  

闽ICP备14008679号