常用排序算法之--时间复杂度计算

本篇博文非博主原创,系通过度娘收集整理而来,如有雷同,请联系博主,追加上转载出处。同时博主水平和理解有限,如有什么偏差请广大博友指定。

学习交流qq:792911374

时间复杂度

同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。一个算法的时间开销记作:T(n),其中n表示算法的基本操作模块被重复执行的次数。算法的时间复杂度记做T(n)=O(f(n)),随着n的增大,算法执行时间的增长率和f(n)的增长率成正比,所以f(n)越小,算法的时间复杂度越低,算法的效率越高。时间复杂度常用大O符号表述。这种用大写的O来代表算法的时间复杂度的记法叫"大O阶"记法。

算法的时间复杂度(大O阶)的计算方法为:

1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留高阶项。
3、如果最高阶项存在且不是1,则去除与这个项相乘的常数。

也就是当n增大到一定值后,对时间复杂度影响最大的就是n的幂次最高的项,其他的常数项和低幂次项都可以忽略不计。

例如:

在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数。例如:

 1 int n = 100000; //执行了1次
 2 for(int i = 0; i < n; i++){  //执行了n+1次
 3   for(int j = 0; j < n; j++) //执行了n*(n+1)次
 4   {
 5       printf("i = %d, j = %d", i, j); //执行了n*n次
 6   }
 7 }
 8
 9 for(int i = 0; i < n; i++){  //执行了n+1次
10   printf("i = %d", i); //执行了n次
11 }
12
13 printf("Done"); //执行了1次

按上面推导"大O阶"的步骤我们先来第一步:"用常数1取代运行时间中的所有加法常数",则上面的算式变为:
执行总次数 = 2n^2 + 3n + 1;

第二步:"在修改后的运行次数函数中,只保留最高阶项",这里的最高阶项是n的二次方
所以算式变为:
执行总次数 = 2n^2;

第三步:"如果最高阶项存在且不是1,则去除与这个项相乘的常数",这里n的二次方不是1所以
要去除这个项相乘的常数算式变为:
执行总次数 = n^2;

因此,最后我们得到上面的那段代码的算法时间复杂度表示为: O(n^2);

按数量级递增排列,常见的时间复杂度有:
常数阶O(1), 对数阶O(log2n),线性阶O(n)
线性对数阶O(nlog2n), 平方阶O(n^2), 立方阶O(n^3)..., k次方阶O(n^k), 指数阶O(2^n),随着问题规模n的不断增大,
上述时间复杂度不断增大,算法的执行效率越低。

如:嵌套一层for循环的时间复杂度为:O(n),二层for循环为O(n^2),二分的算法时间复杂度为:O(logn),如果一个for循环套一个二分,那么时间复杂度为O(nlogn);

时间: 2024-10-30 18:35:48

常用排序算法之--时间复杂度计算的相关文章

【计算机基础】 常用的排序算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n) 选择排序 O(n2) O(n2) 稳定 O(1) 二叉树排序 O(n2) O(n*log2n) 不一顶 O(n) 插入排序 O(n2) O(n2) 稳定 O(1) 堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1) 希尔排序 O O 不稳定 O(1) 1

常用排序算法时间复杂度和空间复杂度简析

1. preface /**** *    This article will try to explain something about: *        --Bubble sort. *        --Quick sort. *        --Merge sort. *        --Heap sort. *    To read this, some prerequisites is necessary: *        --a survive skill in C pr

常用的排序算法和时间复杂度

1. 数据结构部分 数据结构中常用的操作的效率表 通用数据结构 查找 插入 删除 遍历 数组 O(N) O(1) O(N) - 有序数组 O(logN) O(N) O(N) O(N) 链表 O(N) O(1) O(N) - 有序链表 O(N) O(N) O(N) O(N) 二叉树 O(logN) O(logN) O(logN) O(N) 二叉树(最坏) O(N) O(N) O(N) O(N) 红黑树 O(logN) O(logN) O(logN) O(N) 2-3-4树 O(logN) O(lo

C#中常用的排序算法的时间复杂度和空间复杂度

常用的排序算法的时间复杂度和空间复杂度 常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 O(n2) O(n*log2n) 不稳定 O(log2n)~O(n) 选择排序 O(n2) O(n2) 稳定 O(1) 二叉树排序 O(n2) O(n*log2n) 不一顶 O(n) 插入排序 O(n2) O(n2) 稳定 O(1) 堆排序 O(n*log2n) O(n*log2n) 不稳定 O(1)

常用排序算法的python实现和性能分析

http://www.cnblogs.com/wiki-royzhang/p/3614694.html 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试题整了一下,可以阶段性的留下些脚印——没办法,平时太忙,基本上没有时间写博客.面试测试开发的话,这些也许能帮得上一些. 这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数

常用排序算法的python实现

排序算是编程最基本的算法问题之一了,熟练掌握排序算法也能加深自己对数据结构的理解,也能提高自己的编程能力,以下为个人参考许多大神博客后对常用排序算法的学习总结. 目录: 概述 冒泡排序 直接插入排序 简单选择排序 希尔排序 堆排序 归并排序 快速排序 算法的比较与测试 参考 1. 概述 所谓排序(sorting)就是整理数据的序列,使其按照特定顺序排列的操作.排序在现实生活中(如整理书籍,表格数据等),在计算领域中(如二分查找,图论的最小生成树的Kruskal算法)均有重要意义,所以一种高效的排

常用排序算法比较与分析

一.常用排序算法简述 下面主要从排序算法的基本概念.原理出发,分别从算法的时间复杂度.空间复杂度.算法的稳定性和速度等方面进行分析比较.依据待排序的问题大小(记录数量 n)的不同,排序过程中需要的存储器空间也不同,由此将排序算法分为两大类:[内排序].[外排序]. 内排序:指排序时数据元素全部存放在计算机的随机存储器RAM中. 外排序:待排序记录的数量很大,以致内存一次不能容纳全部记录,在排序过程中还需要对外存进行访问的排序过程. 先了解一下常见排序算法的分类关系(见图1-1) 图1-1 常见排

七种常用排序算法

七种常用排序算法 一.常见排序算法一览: 时间复杂度: 是一个函数,它定量描述了该算法的运行时间. 空间复杂度:一个算法在运行过程中临时占用存储空间大小的量度. 稳定性:保证排序前2个相等的数其在序列的前后位置顺序和排序后它们两个的前后位置顺序相同就稳定,反之不稳定. 视觉直观感受 7 种常用的排序算法 二.算法C#实现: 1. 直接插入排序: using System; using System.Collections.Generic; using System.Linq; using Sys

常用排序算法之——归并排序

归并排序的原理: 如果数组的元素个数大于1,则: 将数组平均分为两部分: 左边的数组归并排序:递归 右边的数组归并排序:递归 将两个各自有序的数组合并,需要一个额外的辅助数组,暂时保存合并结果:返回 否则,数组元素个数为1时,已经有序:直接返回. 稳定排序.时间复杂度在最坏.最好.平均情况下都为O(N lgN),空间复杂度为O(N). 代码: 1 #include <iostream> 2 using namespace std; 3 4 template<typename T>