南阳理工学院(期末)算法分析练习题

一、算法阅读分析题:

1.分析如下算法,回答问题(10分)。

  1. 该算法的作用是什么(2分)?
  2. 分析该算法的时间复杂度(5分)?
  3. 设计算法的一个输入,并给出对应的算法输出结果(3分)

(1)该算法的作用

这段代码实现了归并排序(Merge Sort)算法,用于对数组进行排序。归并排序是一种分治策略的排序方法,它将数组分成越来越小的部分排序,然后合并以产生最终的排序数组。

(2)分析该算法的时间复杂度

归并排序的时间复杂度为O(nlogn),其中 n 是数组中元素的数量。具体分析如下:

分解:每次递归调用将问题分成两半,总共需要分 logn 层,因为每次都是对半分。

合并操作:每层合并的时间复杂度为O(n),因为每个元素最多被复制和移动一次。

整体复杂度:由于有logn 层,每层都需要 O(n) 的时间,因此总的时间复杂度是 O(nlogn)。

(3)设计算法的一个输入,并给出对应的算法输出结果

假设我们有一个包含7个元素的数组,元素如下:5,2,9,1,5,6,7

输入流程:

用户输入元素的个数 n=7。

用户依次输入数组元素:5, 2, 9, 1, 5, 6, 7。

算法输出:

经过归并排序后,数组应该是排序好的状态。按照给定的输入,排序的结果如下:

1,2,5,5,6,7,9

合并排序结果:1 2 5 5 6 7 9

这个输出展示了经过归并排序处理的数组,从最小到最大顺序排列

2.分析n皇后问题的求解算法,回答如下问题(10分)

  1. 该算法是否随机算法,为什么(3分)?
  2. 如果是,属于哪一类随机算法,为什么(3分)?
  3. 变量num、count的作用是什么(2分)?
  4. 函数queen的作用是什么(2分)?

算法2

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#define N 20

int q[N], num=0;

void dispasolution(int n)

{

printf("  第%d次运行找到一个解: ",num);

for (int i=1;i<=n;i++)

printf("(%d,%d) ",i,q[i]);

printf("\n"); 

}

int randa(int a,int b) //产生n个[a,b]的随机数

{

return rand()%(b-a+1)+a;

}

bool place(int i,int j)

{

if (i==1) return true;

int k=1;

while (k<i)

{ if ((q[k]==j) || (abs(q[k]-j)==abs(i-k)))

return false;

k++;

}

return true;

}

bool queen(int i,int n)

{ int count,j;

if (i>n)

{ dispasolution(n);

return true;

}

else

{ count=0;

while (count<=n)

{ j=randa(1,n);

count++;

if (place(i,j)) break;

}

if (count>n) return false;

q[i]=j;

queen(i+1,n);

}

}

void main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值