文档库 最新最全的文档下载
当前位置:文档库 › 给出以下算法的时间复杂度

给出以下算法的时间复杂度

给出以下算法的时间复杂度
给出以下算法的时间复杂度

第1章绪论

1、填空题

1.常见的数据结构有_________结构,_________结构,_________结构等三种。

2.常见的存储结构有_________结构,_________结构等两种。

3.数据的基本单位是_________,它在计算机中是作为一个整体来处理的。

4.数据结构中的结构是指数据间的逻辑关系,常见的结构可分为两大类,_________和_________。

2、应用题

1、给出以下算法的时间复杂度.

void fun(int n)

{

int i=1,k=100;

while(i

{

k=k+1;

i=i+2;

}

}

时间复杂度为_______________。

2、给出以下算法的时间复杂度.

void fun2(int n)

{

int i=1,k=100;

while(i

{

i=i*10;

k=k+1;

}

}

时间复杂度为_______________。

第2章线性表

1、填空题

1. 线性表按照存储结构不同主要有两种实现方式,一种是_______________表,另一种是_______________表。

2.顺序表采用_______________访问机制对数据元素进行访问。

3.若在单链表结点p的后面插入一个新的结点s,则其操作序列为:

①_____________________________;

②_____________________________;

4.在单向链表中,若要删除某个结点p,必须要找到_______________结点,才能实现该操作。

2、选择题

1.将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数

是。

(A)n (B)2n-1 (C)2n (D)n-1

2.在单链表中,如果在结点p之后插入一个新结点s,其操作为。

(A)s->next=p->next; p->next=s;

(B)p->next=s; s->next=p->next;

(C)s->next=p; p->next=s->next;

(D)p->next=s; s->next=p;

3.若长度为n的线性表采用顺序存储结构,在其第i个位置删除一个元素的算法的平均时间复杂度为( )。(1≤i≤n)

A.O(0) B.O(1) C.O(n) D.O(n2)

4. 若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素需要移动的元素个数为( )。(1≤i≤n+1)

A.n-i B.n-i+1 C. i D.n-i-1

3、判断题

1.线性表中每一个元素都有一个前驱和一个后继。()

4、程序设计题

1、单链表的结点结构定义如下:

struct LinkNode

{

LinkNode *next;

int data;

};

请根据述函数的功能写程序。(10分)

void Insert(LinkNode *h,LinkNode *s)

{//h指向链表的头结点(即使链表中没有元素,头结点也存在。)

//链表中元素已经递增有序

//函数功能为将结点s插入到链表h中。插入后链表仍然保持递增的顺序}

2、设顺序表L是一个递增有序表,试写一算法,将x插入L中,并使L 仍是一个有序表。顺序表的结构定义如下:

#define ListSize 100 // 假定表空间大小为100

struct SqList {

int elem[ListSize]; // 数组elem用于存放表中的数据

int length; // 当前的表长度

};

//以上为顺序表的结构

//函数头定义如下

void InsertIncreaseList( SqList &L ,int x )

{

}

///////

3、单链表中结点的结构如下所示:

typedef struct node

{ int data;

struct node *next;

}node;

请设计满足下述功能的函数。

要求:建立带头结点的单链表H,要求函数从屏幕上读入m个整数,每读入一个,便生成相应的结点,并且把它插入到链表H的尾部。函数形式为void CreateLinkList(node *H)。(10分)

第3章栈和队列

1、填空题

1.栈和队列在本质上都是_____________。

2.栈的操作特点是_____________。队列的操作特点是_____________。

3.栈和队列是一种特殊的_____________,栈的特点是_____________;队列的特点是_____________。

2、选择题

1.消除递归不一定需要使用栈,此说法_______。

A. 正确

B. 错误

2.对于栈,输入序列为(1,2,3,4),不可能得到的输出序列有_______。

(A)(1,2,3,4)(B)(4,3,2,1)

(C)(1,3,4,2)(D)(3,1,2,4)

3.用单循环链表表示队列,正确的说法是。

(A)可设一个头指针使入队、出队都方便;

(B)可设一个尾指针使入队、出队都方便;

(C)必须设头尾指针才能使入队、出队都方便;

(D)无论如何,只可能使入队方便。

3、判断题

1.栈的特点是先进先出。()

2.可以在队列的任意位置插入元素。()

3.递归程序化非递归程序必须用到栈。()

4.如果进栈的序列为(1,2,3,4),则(4,2,3,1)不可能是出栈序列。

()

5.在用顺序表表示的循环队列中,可用标志位来区分队空或队满的条件。

()第4章串

1、选择题

1. 设有两个串p和q,求q在p中首次出现的位置的运算称作()

A.连接 B.模式匹配 C.求子串 D.求串长

2、判断题

1.空串和空格串是同一个概念,二者没有区别。()

第5章数组和广义表

1、填空题

1.二维数组在内存中存储可以有两种存储方式,一种是_________优先存

储,一种是优先存储。

2.设广义表L=((),(),(()))。则head(L)是;tail(L)

是;L的长度是;L的深度是。

3.设广义表L=((),(),(())) 则head(L)是________;tail(L)是

________。

2、选择题

1.在C语言中,如果有数组定义 int A[8][9];假定每个整型数据占2字节,则数组元素A[4][4]的地址是()。

A. A+80

B. A+76

C.A+82

D.以上都不对

2.广义表A=(a,b,(c,d),(e,(f,g))),则下面式子的值为( );

Head(Tail(Head(Tail(Tail(A)))))

A.(g) B.(d) C.c D.d

3、判断题

1.在C语言中,多维数组的存储采取的是行优先的方式。()

2.广义表在本质上也是线性表。()

3.可以用三元组存储法来压缩存储稀疏矩阵。()

4.已知广义表A=((a,b,c),(d,e,f)),从A中取出原子e的运算是head(tail(head(tail(A))))。 ( )

第6章树和二叉树

1、填空题

1.一棵62个叶结点的完全二叉树,最多有________________个结点。

2.若规定仅有根的二叉树的高度为1,那么高为h的完全二叉树最多有-

________________个结点,最少有________________个结点。

3.设只包含有根结点的二叉树的高度为0,则高度为k的二叉树的最大结点数为________________,最小结点数为________________。

4.设仅包含根结点的二叉树的高度为1,则高度为k的二叉树的最大结点数为________________,最小结点数为________________。

2、选择题

1.具有N个结点的完全二叉树的深度是________。

(A)? log

2N ?(B)? log

2

N ?+1

(C)? log

2(N) ?(D)? log

2

N ?-1

2.设二叉树的树根为第一层,则第i层上至多有_______结点。

(A)1 (B)2 (C)2i-1 (D)2i-1

3、判断题

1.二叉树的左右子树次序是严格的,不能够任意改变。()

2.深度为k的满二叉树的结点为2k-1 。()

3.二叉树的三叉链表存储结构可以方便的访问到双亲结点。()

4、应用题

1.在一段文字中,共出现a、b、c、d、e、f六种字符,每种字符出现的频率分别为7,9,12,22,23,27。请回答下列问题:

(1)什么是哈夫曼树?(3分)

(2)根据题目所给频率值,画出相应的哈夫曼树。(11分)

(3)给出各个字符对应的哈夫曼编码。(6分)

(4)该段文字经过哈夫曼编码后,长度是多少。(4分)

2. 设一棵二叉树的先序遍历序列为abcde,中序遍历序列为badce,请画出对应的二叉树,并写出对应后序遍历序列。(15分)

3.通信报文中出现的字符A、B、C、D、E,在报文中出现的频率分别为0.23、0.2、0.32、0.12、0.13,分别给出相应字符的哈夫曼编码(要求画出哈夫曼树,并且把权值小的结点放在左边)。(共14分)

4.某二叉树结点的中序序列为H,B,C,D,E,F,G,后序序列为B,D,C,H,F,G,E,请据此画出该二叉树,再给该树加上中序线索。(共15分)

5.请证明对于任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。(10分)

6.请按照孩子-兄弟表示法,将图1所示树转化为二叉树。(共14分)

7.设二叉树如图2所示。分别写出它的先序遍历、中序遍历、后序遍历序列。(共15分)

8.

(1)写出如图所示二叉树的中序遍历结果。(8分) (2)画出二叉树的中序后继线索。(10分)

9.

已知某二叉树的前序遍历序列为:A B C D E F G 和中序遍历序列为:C B E D A F G 。请画出该二叉树。

10.

已知通信联络中只可能出现A 、B 、C 、D 、E 、F 、G 、H 共8种字符,其出现次数分别为5,28,7,9,14,23,3,11次。

(1)请画出赫夫曼树(权值小的结点在左边)。(15分) (2)计算该树的带权路径长度。(3分)

图2

5、读程序写结果

已知二叉树的结点结构如下:Array struct Node

{

int data;

Node *lchild,*rchild;

};

某棵二叉树的形态如右图:

根据要求解答下题:

1、 (共5分)

int fun1(Node *root)

{

if(root==0) return 0;

int l,r;

l=fun1(root->lchild);

r=fun1(root->rchild);

if(l>=r) return l+1;

else return r+1;

}

(1)当root是指向结点A的指针时,函数fun1的返回值是多少?(2分) (2)函数fun1的功能是什么?(3分)

2、 (共6分)

int fun2(Node *root)

{

if(root==0) return 0;

int l=fun2(root->lchild );

int r=fun2(root->rchild );

return l+r+1;

}

(1)当root是指向结点A的指针时,函数fun1的返回值是多少?(2分) (2)函数fun1的功能是什么?(4分)

第7章图

1、填空题

1. 有n个顶点的有向连通图最多有条边,最少有条边。

2.具有n个顶点的完全无向图有________条边,完全有向图有________条边。

2、选择题

1. __________方法可以判断出一个有向图中是否有环(回路)。

(A)深度优先遍历 (B)拓扑排序

(C)求最短路径 (D)求关键路径

2.关键路径是指__________。

(A)从开始事件到终止事件路径长度最短的路径

(B)从开始事件到终止事件路径长度最长的路径

(C)从开始事件到终止事件活动最少的路径

(D)从开始事件到终止事件活动最多的路径

3.方法可以判断出一个有向图中是否有环(回路)。

(A)深度优先遍历 (B)拓扑排序

(C)求最短路径 (D)求关键路径

3、判断题

1.具有n个顶点的有向图最多有n*(n-1)条边。()

2.在AOV-网中,不应该出现有向环,因为存在环就意味着活动可以以自己为先决条件。()

4、应用题

1、已知某图的存储结构如下,试写出该图从顶点A开始的深度优先遍历序列。(11分)

A

B

C

D

E

F

G

H

I

J

K

2. 请给出图1的所有最小生成树。(10分)

图1

3. 请给出图2的所有拓扑排序序列。(16)

4、对于有向无环图(如图2),写出它的所有不同的拓扑有序序列。(共16分)

图2

5、请画出图3的所有最小生成树。(共10分)

6. 已知某图采取如图2所示的邻接矩阵表示法,请回答下列问题。(共12分)

1 2 3 4 5 6

图2

(1) 请画出该图。(6分)

(2)对其从顶点A开始进行深度优先遍历,写出遍历序列。(6分)

7、(本题总计 7 分)

构造该图的最小生成树。

5、程序设计题

第8章动态存储管理

1、填空题

2、选择题

3、判断题

4、应用题

5、程序设计题

第9章查找

1、选择题

1.若在线性表中采用二分查找法查找元素,该线性表应该( )。

A.元素按值有序 B.采用顺序存储结构

C.元素按值有序,且采用顺序存储结构

D.元素按值有序,且采用链式存储结构

2.对二叉排序树进行_________遍历,可以得到该二叉树所有结点构成的有

序序列。

(A) 前序(B)中序(C)后序(D)按层次

3.利用逐点插入法建立序列(51,71,43,81,74,20,34,45,64,30)对应的二叉排序树以后,查找元素34要进行( )元素间的比较。

A.4次 B.5次 C. 7次 D.10

4.对二叉排序树进行____________遍历,可以得到该二叉树所有结点构成的有序序列。

(A) 前序(B)中序(C)后序(D)按层次

5.散列函数有一个共同性质,即函数值应按( )取其值域的每一个值。

A.最大概率

B.最小概率

C.同等概率

D.平均概率

6.一个哈希函数被认为是“好的”,如果它满足条件_________。

(A)哈希地址分布均匀

(B)保证不产生冲突

(C)所有哈希地址在表长范围内

(D)满足(B)和(C)

7.哈希表的平均查找长度是__________的函数。

(A)哈希表的长度(B)表中元素的多少

(C)哈希函数(D)哈希表的装满程度

8.平均查找长度最短的查找方法是____________。

(A)折半查找(B)顺序查找(C)哈希查找(4)其他

2、判断题

1.在有序表的查询过程中,设立“哨兵”的作用是为了提高效率。()

2.对于折半查找,其前提条件是待查找序列只要是有序的即可。()

3、应用题

1.

输入一个正整数序列(53,17,12,66,58,70,87,25,56,60),试完成下列各题。

(1)按输入次序构造一棵二叉排序树(只要求画出最终二叉排序树)。

(2)依此二叉排序树,如何得到一个从小到大的有序序列?

2、若一棵排序二叉树的关键字输入序列为{80,6,10,7,8,25,100,90},请画出该二叉树。

3.

已知一组关键字为{1,14,27,29,55,68,10,11,23},则按哈希函数H(key)=key MOD 13和链地址法处理冲突来构造哈希表。

(1)画出所构造的哈希表。

(2)在记录的查找概率相等的前提下,计算该表查找成功时的平均查找长度。

4、程序设计题

1.二叉排序树的结点结构如下所示:

typedef struct node

{ int data;

struct node *lchild,*rchild;

}node;

请编写在二叉排序树T中查找值为x的结点的非递归算法,如果查到,返回指向该结点的指针,否则返回空。函数形式为:

node* Search(node *T, int x)。(10分)

///////////////

2.已知整型数组A,从第一个单元(即A[1])开始存储数据,且一共存储了n个元素。要求编写折半查找元素e的过程。当数组中存在元素e时,返回其下标,否则返回0。(10分)

int BinarySearch(int *A,int n,int e)

//////////////

3.已知整型数组A[101],其中从A[1]到A[100]存储了100个整数,试编写函数int Find(int A[101],int x),功能为从数组A中折半查找元素x,如果找到则返回x所对应的下标,否则的话返回0。

第10章内部排序

1、填空题

1.快速排序和堆排序的平均时间复杂度分别为________和________。

2、选择题

1.下面给出的四种排序法中( )排序法是不稳定性排序法。

A.插入 B.冒泡 C.二路归并 D.堆排序

2.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比

较,然后将其放在已排序序列的合适位置,该排序方法称为排序法。

(A)插入(B)选择(C)希尔(D)二路归并

3.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比

较,然后将其放在已排序序列的合适位置,该排序方法称为______排序法。

(A)插入(B)选择(C)谢尔(D)二路归并

3、判断题

1.从平均性能而言,快速排序最佳,其所需时间最省。()

4、应用题

1. 对于关键字序列{49,38,65,97,76,13},回答下述问题。(共12分)

(1)写出一趟冒泡排序的结果。(6分)

(2)写出一趟快速排序的结果。(6分)

第11章外部排序

第12章文件

算法时间复杂度的计算

算法时间复杂度的计算 [整理] 基本的计算步骤 时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次数T(n) 基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。 2. 计算出T(n)的数量级 求T(n)的数量级,只要将T(n)进行如下一些操作: 忽略常量、低次幂和最高次幂的系数 令f(n)=T(n)的数量级。 3. 用大O来表示时间复杂度 当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。 一个示例: (1) int num1, num2; (2) for(int i=0; i

算法复杂度分析

算法复杂度分析 算法与程序设计2010-08-30 20:47:10 阅读13 评论0 字号:大中小 订阅 首先接触" 算法复杂度"这个术语是在数据结构这门课程中。数据结构主要是讲如何在计算机中存储.组织数据,对于相同的存储.组织数据方式,往往又有不同的实现方式(即算法)。对于精心实现的算法,往往可以带来更高的运行和存储上的效率,而评价一个实现方式(算法)是否高效就是通过" 算法复杂度"来评定的。目前算法的评定主要是从时间和空间上来评定,毕竟我们对计算机关心的一个是运行时间,另一个就是消耗的存储空间。从时间上评定算法的优劣称为"时间复杂度",自然,从空间上评定算法的优劣就称为"空间复杂度"。 一.时间复杂度: 一个算法执行所用的时间,理论上讲是不能通过计算得出来的,因为它受多方面的影响,比如说不同的硬件,相同的算法在不同的硬件机器上执行,所消耗的时间是不同的。即使是在同一台机器上,一个算法在不同的时间执行,所消耗的时间也是不同的(当某个时刻计算机系统待处理的任务比较多时,这个时刻算法执行消耗的时间相对于计算机系统待处理任务较少时,所用的时间可能会多些)。我们使用"时间复杂度"并不是为了计算算法执行所消耗的时间,而是用于评定不同的算法之间在时间成本上,那个消耗的时间理论上少些,那个多些。背后的原理是这样的:如果有两个算法A,B,假如它们实现的功能都是在一个相同长度的数组内查找符合条件的一个元素位置。经过"时间复杂度"的评定,算法A 在时间成本上比算法B消耗的时间要少。那么在实际运行中算法A的执行应该会比算法B快。请注意我使用了"应该"这个词语,毕竟任何情况都有特殊的时候,不是吗?但毕竟特殊的情况属于少数,大多数情况下还是正常的。所以请不要认为"算法复杂度"是属于理论的东西,没有什么实际的意义。它在评定算法优劣上占有非常重要的地位。 讨论时间复杂度时,不得依次说明下面几个术语所表达的意思,当对这些术语背后表达的意思明白过后,"时间复杂度"也自然而然的明白了。 1.算法消耗时间. 一个算法执行所消耗的时间= 算法中所有语句执行的时间之和。 如果我们独立机器的软,硬件。假定语句执行一次所消耗的时间一样,并把语

算法的时间复杂性

算法的时间复杂度计算 定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。 我们常用大O表示法表示时间复杂性,注意它是某一个算法的时间复杂性。大O表示只是说有上界,由定义如果f(n)=O(n),那显然成立f(n)=O(n^2),它给你一个上界,但并不是上确界,但人们在表示的时候一般都习惯表示前者。 此外,一个问题本身也有它的复杂性,如果某个算法的复杂性到达了这个问题复杂性的下界,那就称这样的算法是最佳算法。 “大O记法”:在这种描述中使用的基本参数是 n,即问题实例的规模,把复杂性或运行时间表达为n的函数。这里的“O”表示量级 (order),比如说“二分检索是 O(logn)的”,也就是说它需要“通过logn量级的步骤去检索一个规模为n的数组”记法 O ( f(n) )表示当 n增大时,运行时间至多将以正比于 f(n)的速度增长。 这种渐进估计对算法的理论分析和大致比较是非常有价值的,但在实践中细节也可能造成差异。例如,一个低附加代价的O(n2)算法在n较小的情况下可能比一个高附加代价的 O(nlogn)算法运行得更快。当然,随着n足够大以后,具有较慢上升函数的算法必然工作得更快。 O(1) Temp=i;i=j;j=temp; 以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。 O(n^2) 2.1. 交换i和j的内容 sum=0;(一次) for(i=1;i<=n;i++) (n次) for(j=1;j<=n;j++) (n^2次) sum++;(n^2次) 解:T(n)=2n^2+n+1 =O(n^2) 2.2. for (i=1;i

算法的含义及算法复杂度分析方法

算法的含义 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。 特征 一个算法应该具有以下六个重要的特征: 算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。 1、有限性 算法的有穷性是指算法必须能在执行有限个步骤之后终止; 2、确切性 算法的每一步骤必须有确切的定义; 3、输入 一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件; 4、输出一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的; 算法复杂度分析 通常一个算法的复杂度是由其输入量决定的,随着输入的增加,复杂度越大。一个算法的评价主要从时间复杂度和空间复杂度来考虑。 方法: 时间复杂度 (1)算法耗费的时间和语句频度 一个算法所耗费的时间=算法中每条语句的执行时间之和 每条语句的执行时间=语句的执行次数(即频度(Frequency Count))×语句执行一次所需时间算法转换为程序后,每条语句执行一次所需的时间取决于机器的指令性能、速度以及编译所产生的代码质量等难以确定的因素。 若要独立于机器的软、硬件系统来分析算法的时间耗费,则设每条语句执行一次所需的时间均是单位时间,一个算法的时间耗费就是该算法中所有语句的频度之和。 (2)问题规模和算法的时间复杂度 算法求解问题的输入量称为问题的规模(Size),一般用一个整数表示。 矩阵乘积问题的规模是矩阵的阶数。 一个图论问题的规模则是图中的顶点数或边数。 一个算法的时间复杂度(Time Complexity, 也称时间复杂性)T(n)是该算法的时间耗费,是该算法所求解问题规模n的函数。当问题的规模n趋向无穷大时,时间复杂度T(n)的数量级(阶)称为算法的渐进时间复杂度。 (3)渐进时间复杂度评价算法时间性能 主要用算法时间复杂度的数量级(即算法的渐近时间复杂度)评价一个算法的时间性能。 空间复杂度 与时间复杂度类似,空间复杂度是指算法在计算机内执行时所需存储空间的度量。记作: S(n)=O(f(n)) 算法执行期间所需要的存储空间包括3个部分: ·算法程序所占的空间;

最大公约数的三种算法复杂度分析时间计算

昆明理工大学信息工程与自动化学院学生实验报告 ( 2011 —2012 学年第 1 学期) 一、上机目的及内容 1.上机内容 求两个自然数m和n的最大公约数。 2.上机目的 (1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法; (3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) (1)至少设计出三个版本的求最大公约数算法; (2)对所设计的算法采用大O符号进行时间复杂性分析; (3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。

三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及VISUAL C++软件 四、实验方法、步骤(或:程序代码或操作过程) 实验采用三种方法求最大公约数 1、连续整数检测法。 2、欧几里得算法 3、分解质因数算法 根据实现提示写代码并分析代码的时间复杂度: 方法一: int f1(int m,int n) { int t; if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; } return t; } 根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2; 方法二:int f2(int m,int n) {

r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return n; } 根据代码辗转相除得到欧几里得的O(n)= log n 方法三: int f3(int m,int n) { int i=2,j=0,h=0; int a[N],b[N],c[N]; while(i

给出以下算法的时间复杂度

第1章绪论 1、填空题 1.常见的数据结构有_________结构,_________结构,_________结构等三种。 2.常见的存储结构有_________结构,_________结构等两种。 3.数据的基本单位是_________,它在计算机中是作为一个整体来处理的。 4.数据结构中的结构是指数据间的逻辑关系,常见的结构可分为两大类,_________和_________。 2、应用题 1、给出以下算法的时间复杂度. void fun(int n) { int i=1,k=100; while(i

while(inext=p->next; p->next=s; (B)p->next=s; s->next=p->next;

算法的时间复杂度计算

for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x++; 它的时间复杂度是多少? 自己计算了一下,数学公式忘得差不多了,郁闷; (1)时间复杂性是什么? 时间复杂性就是原子操作数,最里面的循环每次执行j次,中间循环每次执行 a[i]=1+2+3+...+i=i*(i+1)/2次,所以总的时间复杂性=a[1]+...+a[i]+..+a[n]; a[1]+...+a[i]+..+a[n] =1+(1+2)+(1+2+3)+...+(1+2+3+...+n) =1*n+2*(n-1)+3*(n-2)+...+n*(n-(n-1)) =n+2n+3n+...+n*n-(2*1+3*2+4*3+...+n*(n-1)) =n(1+2+...+n)-(2*(2-1)+3*(3-1)+4*(4-1)+...+n*(n-1)) =n(n(n+1))/2-[(2*2+3*3+...+n*n)-(2+3+4+...+n)] =n(n(n+1))/2-[(1*1+2*2+3*3+...+n*n)-(1+2+3+4+...+n)] =n(n(n+1))/2-n(n+1)(2n+1)/6+n(n+1)/2 所以最后结果是O(n^3)。 【转】时间复杂度的计算 算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学复习起来无从下手,

下面我们就这个问题给各位考生进行分析。 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。 下面我们通过例子加以说明,让大家碰到问题时知道如何去解决。 1、设三个函数f,g,h分别为f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^1.5+5000nlgn 请判断下列关系是否成立: (1)f(n)=O(g(n)) (2)g(n)=O(f(n)) (3)h(n)=O(n^1.5) (4)h(n)=O(nlgn) 这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤C?f(n)。"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。这么一来,就好计算了吧。 ◆(1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。 ◆(2)成立。与上同理。 ◆(3)成立。与上同理。 ◆(4)不成立。由于当n→∞时n^1.5比nlgn递增的快,所以h(n)与nlgn的比值不是常数,

算法的时间复杂度

算法的时间复杂度 Prepared on 22 November 2020

时间复杂度:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数,T(n)称为这一算法的“时间复杂度”。渐近时间复杂度:当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂度”。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶 O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。 下面我们通过例子加以说明,让大家碰到问题时知道如何去解决。 1、设三个函数f,g,h分别为 f(n)=100n^3+n^2+1000 , g(n)=25n^3+5000n^2 , h(n)=n^+5000nlgn 请判断下列关系是否成立: (1) f(n)=O(g(n)) (2) g(n)=O(f(n)) (3) h(n)=O(n^ (4) h(n)=O(nlgn)

这里我们复习一下渐近时间复杂度的表示法T(n)=O(f(n)),这里的"O"是数学符号,它的严格定义是"若T(n)和f(n)是定义在正整数集合上的两个函数,则T(n)=O(f(n))表示存在正的常数C和n0 ,使得当n≥n0时都满足0≤T(n)≤Cf(n)。"用容易理解的话说就是这两个函数当整型自变量n趋向于无穷大时,两者的比值是一个不等于0的常数。这么一来,就好计算了吧。 ◆ (1)成立。题中由于两个函数的最高次项都是n^3,因此当n→∞时,两个函数的比值是一个常数,所以这个关系式是成立的。 ◆(2)成立。与上同理。 ◆(3)成立。与上同理。 ◆(4)不成立。由于当n→∞时n^比nlgn递增的快,所以h(n)与nlgn的比值不是常数,故不成立。 2、设n为正整数,利用大"O"记号,将下列程序段的执行时间表示为n的函数。 (1) i=1; k=0 while(i

算法时间复杂度计算示例

基本计算步骤 示例一: (1) int num1, num2; (2) for(int i=0; i

算法时间复杂度计算示例

算法时间复杂度计算示 例 Company number:【WTUT-WT88Y-W8BBGB-BWYTT-19998】

基本计算步骤? 示例一:? (1) int num1, num2; (2) for(int i=0; i

数据结构时间复杂度的计算

数据结构时间复杂度的计算 for(i=1;i<=n;i++) for(j=1;j<=i;j++) for(k=1;k<=j;k++) x++; 它的时间复杂度是多少? 自己计算了一下,数学公式忘得差不多了,郁闷; (1)时间复杂性是什么? 时间复杂性就是原子操作数,最里面的循环每次执行j次,中间循环每次执行 a[i]=1+2+3+...+i=i*(i+1)/2次,所以总的时间复杂性=a[1]+...+a[i]+..+a[n]; a[1]+...+a[i]+..+a[n] =1+(1+2)+(1+2+3)+...+(1+2+3+...+n) =1*n+2*(n-1)+3*(n-2)+...+n*(n-(n-1)) =n+2n+3n+...+n*n-(2*1+3*2+4*3+...+n*(n-1)) =n(1+2+...+n)-(2*(2-1)+3*(3-1)+4*(4-1)+...+n*(n-1)) =n(n(n+1))/2-[(2*2+3*3+...+n*n)-(2+3+4+...+n)] =n(n(n+1))/2-[(1*1+2*2+3*3+...+n*n)-(1+2+3+4+...+n)] =n(n(n+1))/2-n(n+1)(2n+1)/6+n(n+1)/2 所以最后结果是O(n^3)。 【转】时间复杂度的计算 算法复杂度是在《数据结构》这门课程的第一章里出现的,因为它稍微涉及到一些数学问题,所以很多同学感觉很难,加上这个概念也不是那么具体,更让许多同学复习起来无从下手,下面我们就这个问 题给各位考生进行分析。 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中 频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。

时间复杂度的计算

时间复杂度的计算 学习数据结构时,觉得时间复杂度计算很复杂,怎么也看不懂,差不多三年之后,还是不懂,马上就要找工作了,赶紧恶补一下吧: 首先了解一下几个概念。一个是时间复杂度,一个是渐近时间复杂度。前者是某个算法的时间耗费,它是该算法所求解问题规模n的函数,而后者是指当问题规模趋向无穷大时,该算法时间复杂度的数量级。 当我们评价一个算法的时间性能时,主要标准就是算法的渐近时间复杂度,因此,在算法分析时,往往对两者不予区分,经常是将渐近时间复杂度T(n)=O(f(n))简称为时间复杂度,其中的f(n)一般是算法中频度最大的语句频度。 此外,算法中语句的频度不仅与问题规模有关,还与输入实例中各元素的取值相关。但是我们总是考虑在最坏的情况下的时间复杂度。以保证算法的运行时间不会比它更长。 常见的时间复杂度,按数量级递增排列依次为:常数阶O(1)、对数阶O(log2n)、线性阶O(n)、线性对数阶O(nlog2n)、平方阶O(n^2)、立方阶O(n^3)、k次方阶O(n^k)、指数阶O(2^n)。 1. 大O表示法 定义 设一个程序的时间复杂度用一个函数 T(n) 来表示,对于一个查找算法,如下: int seqsearch( int a[], const int n, const int x) { int i = 0; for (; a[i] != x && i < n ; i++ ); if ( i == n) return -1; else return i; } 这个程序是将输入的数值顺序地与数组中地元素逐个比较,找出与之相等地元素。 在第一个元素就找到需要比较一次,在第二个元素找到需要比较2次,……,在第n个元素找到需要比较n次。对于有n个元素的数组,如果每个元素被找到的概率相等,那么查找成功的平均比较次数为: f(n) = 1/n (n + (n-1) + (n-2) + ... + 1) = (n+1)/2 = O(n)

最大公约数的三种算法复杂度分析时间计算

理工大学信息工程与自动化学院学生实验报告 (2011 —2012 学年第 1 学期) 课程名称:算法设计与分析开课实验室:信自楼机房444 2011 年10月 12日 一、上机目的及容 1.上机容 求两个自然数m和n的最大公约数。 2.上机目的 (1)复习数据结构课程的相关知识,实现课程间的平滑过渡; (2)掌握并应用算法的数学分析和后验分析方法; (3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。 二、实验原理及基本技术路线图(方框原理图或程序流程图) (1)至少设计出三个版本的求最大公约数算法; (2)对所设计的算法采用大O符号进行时间复杂性分析; (3)上机实现算法,并用计数法和计时法分别测算算法的运行时间; (4)通过分析对比,得出自己的结论。 三、所用仪器、材料(设备名称、型号、规格等或使用软件) 1台PC及VISUAL C++6.0软件 四、实验方法、步骤(或:程序代码或操作过程) 实验采用三种方法求最大公约数 1、连续整数检测法。

根据实现提示写代码并分析代码的时间复杂度: 方法一: int f1(int m,int n) { int t; if(m>n)t=n; else t=m; while(t) { if(m%t==0&&n%t==0)break; else t=t-1; } return t; } 根据代码考虑最坏情况他们的最大公约数是1,循环做了t-1次,最好情况是只做了1次,可以得出O(n)=n/2; 方法二:int f2(int m,int n) { int r; r=m%n; while(r!=0) { m=n; n=r; r=m%n; } return n; } 根据代码辗转相除得到欧几里得的O(n)= log n 方法三: int f3(int m,int n) { int i=2,j=0,h=0; int a[N],b[N],c[N]; while(i

排序算法时间复杂度比较

排序算法比较 主要内容: 1)利用随机函数产生10000个随机整数,对这些数进行多种方法排序。 2)至少采用4种方法实现上述问题求解(可采用的方法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序),并把排序后的结功能果保存在不同的文件里。 3)给出该排序算法统计每一种排序方法的性能(以运行程序所花费的时间为准进行对比),找出其中两种较快的方法。 程序的主要功能: 1.随机数在排序函数作用下进行排序 2.程序给出随机数排序所用的时间。 算法及时间复杂度 (一)各个排序是算法思想: (1)直接插入排序:将一个记录插入到已排好的有序表中,从而得到一个新的,记录数增加1的有序表。 (2)冒泡排序:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则将两个记录交换,然后比较第二个记录和第三个记录的关键字。依此类推,直到第N-1和第N个记录的

关键字进行过比较为止。上述为第一趟排序,其结果使得关键字的最大纪录被安排到最后一个记录的位置上。然后进行第二趟起泡排序,对前N-1个记录进行同样操作。一共要进行N-1趟起泡排序。 (3)快速排序:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。 (4)选择排序:通过N-I次关键字间的比较,从N-I+1个记录中选出关键字最小的记录,并和第I(1<=I<=N)个记录交换。 时间复杂度分析 排序算法最差时间时间复杂度是否稳定? 插入排序O(n2) O(n2) 稳定冒泡排序O(n2) O(n2) 稳定快速排序O(n2) O(n*log n) 不稳定 2 选择排序O(n2) O(n2) 稳定

算法的时间复杂度和空间复杂度-总结分析

算法的时间复杂度和空间复杂度-总结通常,对于一个给定的算法,我们要做两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。 算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常有两种方法。 一、事后统计的方法 这种方法可行,但不是一个好的方法。该方法有两个缺陷:一是要想对设计的算法的运行性能进行评测,必须先依据算法编制相应的程序并实际运行;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优势。 二、事前分析估算的方法 因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。 在编写程序前,依据统计方法对算法进行估算。一个用高级语言编写的程序在计算机上运行时所消耗的时间取决于下列因素: (1). 算法采用的策略、方法;(2). 编译产生的代码质量;(3). 问题的输入规模;(4). 机器执行指令的速度。 一个算法是由控制结构(顺序、分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一个问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作的重复执行的次数作为算法的时间量度。 1、时间复杂度 (1)时间频度一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。 (2)时间复杂度在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度,简称时间复杂度。

如何计算时间复杂度

如何计算时间复杂度 求解算法的时间复杂度的具体步骤是: ⑴ 找出算法中的基本语句; 算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。 ⑵ 计算基本语句的执行次数的数量级; 只需计算基本语句执行次数的数量级,这就意味着只要保证基本语句执行次数的函数中的最高次幂正确即可,可以忽略所有低次幂和最高次幂的系数。这样能够简化算法分析,并且使注意力集中在最重要的一点上:增长率。 ⑶ 用大Ο记号表示算法的时间性能。 将基本语句执行次数的数量级放入大Ο记号中。 如果算法中包含嵌套的循环,则基本语句通常是最内层的循环体,如果算法中包含并列的循环,则将并列循环的时间复杂度相加。例如: for (i=1; i<=n; i++) x++; for (i=1; i<=n; i++) for (j=1; j<=n; j++) x++; 第一个for循环的时间复杂度为Ο(n),第二个for循环的时间复杂度为 Ο(n2),则整个算法的时间复杂度为Ο(n+n2)=Ο(n2)。 常见的算法时间复杂度由小到大依次为: Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!) Ο(1)表示基本语句的执行次数是一个常数,一般来说,只要算法中不存在循环 语句,其时间复杂度就是Ο(1)。Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)和 Ο(n3)称为多项式时间,而Ο(2n)和Ο(n!)称为指数时间。计算机科学家普遍认为前者是有效算法,把这类问题称为P类问题,而把后者称为NP问题。 这只能基本的计算时间复杂度,具体的运行还会与硬件有关。

数据结构算法时间复杂度的计算

时间复杂度的定义 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O 是数量级的符号),简称时间复杂度。 根据定义,可以归纳出基本的计算步骤 1. 计算出基本操作的执行次数T(n) 基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。 2. 计算出T(n)的数量级 求T(n)的数量级,只要将T(n)进行如下一些操作: 忽略常量、低次幂和最高次幂的系数 令f(n)=T(n)的数量级。 3. 用大O来表示时间复杂度 当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。 一个示例: (1) int num1, num2; (2) for(int i=0; i

算法时间复杂度

算法时间复杂度 The final edition was revised on December 14th, 2020.

实验一算法的时间复杂度 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对算法分析基础知识的理解。 二、实验内容: 掌握算法分析的基本方法,并结合具体的问题深入认识算法的时间复杂度分析。三、实验题 定义一个足够大的整型数组,并分别用起泡排序、简单选择排序、快速排序和归并排序对数组中的数据进行排序(按从小到大的顺序排序),记录每种算法的实际耗时,并结合数据结构中的知识对算法的时间复杂度分析进行说明。实验数据分两种情况: 1、数组中的数据随机生成; 2、数组中的数据已经是非递减有序。 四、实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 整理出实验报告。 五、实验程序 #include #include<> #include<> using namespace std; void SelectSort(int r[ ], int n) { int i; int j; int index; int temp; for (i=0; i

实验1-算法的时间复杂性分析

实验报告封面 课程名称:算法分析课程代码: SH3001 任课老师:陈坚强实验指导老师: 陈坚强 实验报告名称:算法的时间复杂性分析 学生姓名: 学号: 教学班: 递交日期: 签收人: 我申明,本报告内的实验已按要求完成,报告完全是由我个人完成,并没有抄袭行为。我已经保留了这份实验报告的副本。 申明人(签名): 实验报告评语与评分: 评阅老师签名:

实验一算法的时间复杂性分析 一、实验目的 1.掌握算法的计算复杂性概念。 2.掌握算法渐近复杂性的数学表述。 3.掌握用C++语言描述算法的方法。 4.实现具体的编程与上机实验,验证算法的时间复杂性函数。 二、实验环境 Windows XP以上版本的操作系统,Visual C++ 6.0 / VS 2005/2008/2010版编程环境。 三、实验内容 1、求下列函数的渐近表达式 (1)3n2+10n o( n2) (2) n2/10+2n o( n2) (3)21+1/n o( ) (4)10 log3n o(n) 2、分析下面算法属于什么功能,并求算法的时间复杂性函数 int factorial(int n) { if (n == 0) return 1; return n*factorial(n-1); } n的阶乘 3、算法实现题,要求写出问题的分析过程,然后上机实现算法

统计数字问题: (1)、问题描述 一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,2, (9) (2)、算法设计 给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2, (9) 提示: 1、POW函数 原型:float pow(float X,int Y); 头文件:#include 功能:计算x的y次幂。 2、int weishu(int n); //求位数 int zuigao(int n); //求最高位的数字 int f(int n); //所有n位数中0-9出现的相同次数

算法的时间复杂度实验报告

实验一算法的时间复杂度 一、实验目的与要求 熟悉C/C++语言的集成开发环境; 通过本实验加深对算法分析基础知识的理解。 软件环境:操作系统:windows7 旗舰版 集成开发环境:visual studio 2010 旗舰版 硬件环境:处理器:因特尔 Core i3 M 380 内存: 2GB 二、实验内容: 掌握算法分析的基本方法,并结合具体的问题深入认识算法的时间复杂度分析。 三、实验题 定义一个足够大的整型数组,并分别用起泡排序、简单选择排序、快速排序和归并排序对数组中的数据进行排序(按从小到大的顺序排序),记录每种算法的实际耗时,并结合数据结构中的知识对算法的时间复杂度分析进行说明。实验数据分两种情况: 1、数组中的数据随机生成; 2、数组中的数据已经是非递减有序。 四、实验步骤 理解算法思想和问题要求; 编程实现题目要求; 上机输入和调试自己所编的程序; 验证分析实验结果; 整理出实验报告。

五、实验程序 #include<> #include<> #include #include<> 组大小ARRAY_MAXSIZE为10000如下: 2.数组大小ARRAY_MAXSIZE为8000如下 3.数组大小ARRAY_MAXSIZE为5000如下: 六、实验分析 1、各算法时间时间消耗图 2、各算法时间性能分析表: 3、分析与说明:

由算法时间复杂度表分析,起泡排序在最好情况下时间性能好,最坏情况和平均情况和选择排序一样,选择排序的时间性能都不高,均为O(n2),根据平均情况来看,快速排序和归并排序的时间性能一样,且最坏情况时归并排序优于快速排序。 对于随机数组序列,数组大小为10000,8000,5000时候,归并排序算法执行时间和快速排序时间都相对较短,简单选择排序缓慢,而起泡排序则是最耗时的。但是当数组由10000变到5000时,归并排序的时间性能变化不大,而快速排序时间性能提高很多,起泡排序时间性能下降慢,所以起泡排序在随机序列中的性能不高。 对于非递减数组序列,起泡排序时间消耗为均为0(0不代表没耗时,只是CPU处理速度太快,没法显示更精确的时间),而其他的快速排序,选择排序,归并排序和随机数组序列情况接近。所以起泡排序在非递减序列中的时间性能高。

相关文档