一、算法阅读分析题:
1.分析如下算法,回答问题(10分)。
- 该算法的作用是什么(2分)?
- 分析该算法的时间复杂度(5分)?
- 设计算法的一个输入,并给出对应的算法输出结果(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分)
- 该算法是否随机算法,为什么(3分)?
- 如果是,属于哪一类随机算法,为什么(3分)?
- 变量num、count的作用是什么(2分)?
- 函数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() |