算法分析与设计实验报告(共25页)

上传人:des****85 文档编号:215695226 上传时间:2021-11-26 格式:DOCX 页数:25 大小:138.91KB
返回 下载 相关 举报
算法分析与设计实验报告(共25页)_第1页
第1页 / 共25页
算法分析与设计实验报告(共25页)_第2页
第2页 / 共25页
算法分析与设计实验报告(共25页)_第3页
第3页 / 共25页
算法分析与设计实验报告(共25页)_第4页
第4页 / 共25页
算法分析与设计实验报告(共25页)_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《算法分析与设计实验报告(共25页)》由会员分享,可在线阅读,更多相关《算法分析与设计实验报告(共25页)(25页珍藏版)》请在金锄头文库上搜索。

1、精选优质文档-倾情为你奉上算法分析与设计实验报告目录实验一:递归与分治1 二分查找 归并排序 快速排序实验二:回溯算法8 01背包实验三:动态规划12 矩阵连乘最少乘法数专心-专注-专业实验一:递归与分治一、实验目的理解递归算法的思想和递归程序的执行过程,并能熟练编写递归程序。掌握分治算法的思想,对给定的问题能设计出分治算法予以解决。二、实验内容1 二分查找在对线性表的操作中,经常需要查找某一个元素在线性表中的位置。此问题的输入是待查元素x和线性表L,输出为x在L中的位置或者x不在L中的信息。2 合并排序3 快速排序对本实验中的问题,设计出算法并编程实现。实验总结及思考3、 实验过程1. 二分

2、查找算法:BinSearch(aArray0,1n-1,key) low-0; right-n-1; while low=right do maArraymid l-mid+1; if keyaArraymid r-mid-1; if key=aArraymid return mid; 代码:#include using namespace std;void Binary(int aArray,int key,int length) /二分查找 int mid,low,high; mid=low=0; high=length-1; while(low=high) mid = low + (hi

3、gh - low)/2); /使用 (low + high) / 2 会有整数溢出的问题 if(low=length|high - low=0) cout元素不存在,查找失败aArraymid) /key在右边 low=mid+1; else if(keyaArraymid) /key在左边 high=mid-1; else cout查找成功,元素的位置是:midendl; break; int main()int length = 0;int key = 0;cout请输入数组的长度: length;int* aArray = new intlength;cout请输入数组:endl; fo

4、r (int i = 0; i aArrayi;cout请输入待查找的数字: key;Binary(aArray,key,length);delete aArray; /释放空间 return 0;二分查找的平均时间复杂度为O(logn)最坏情况下的时间复杂度O(n)运行截图:2. 合并排序基本操作如下: (1)分解:将n 个元素分成各含n/2 个元素的子序列 (2)解决:用合并排序法对两个子序列递归地排序 (3)合并:合并两个已排好序的子序列得到排序结果 在对子序列排序时,其长度为1 时递归结束。单个元素被视为是已排好序的。算法:MergeSort(A0n-1)if n1 copy A0n/

5、2-1toB0n/2-1 copy An/2n-1toC0n/2-1 MergeSort(B0n/2-1) MergeSort(C0n/2-1) Merge(B,C,A)Merge(B0p-1,C0q-1,A0P+q-1)i-0;j-0;k-0while ip and jq do if Bi=Cj Ak-Bi;i-i+1; else Ak-Cj;j-j+1; k-k+1; if i=p copyCjq-1toAkp+q-1 elsecopyBiq-1toAkp+q-1代码:#includeusing namespace std;void Merge(int *a, int p, int q,

6、int r)/把数组a分成L,R,再排序合并成a int n1 = q-p+1;int n2 = r-q;int *L = new intn1+1;int *R = new intn2+1;int i, j, k;for (i=0; in1; i+)Li = ap+i;for (j=0; jn2; j+)Rj = aq+j+1;Ln1 = ;Rn2 = ;for (i=0,j=0,k=p;k=r;k+)if (Li=Rj)ak = Li;i+;elseak = Rj;j+;delete L;delete R;void MergeSort(int *a, int p, int r)/递归调用 i

7、f (pr)int q = (p+r)/2;MergeSort(a, p, q);MergeSort(a, q+1, r);Merge(a, p, q, r); int main()int j = 0;cout请输入数组的长度: j;int* aArray = new intj;cout请输入原始数组:endl; for (int i = 0;i aArrayi;MergeSort(aArray,0,j-1); cout排序后的数组:endl; for (int i = 0;i j;i+)cout aArrayi ;delete aArray;/释放空间 system(pause);retur

8、n 0;归并排序的平均时间复杂度:O(logn)运行截图:3. 快速排序 实现快速排序的分治过程如下: (1)分解:数组Ap.r被划分为两个(可能空)子数组Ap.q-1和Aq+1.r, 使得 Ap.q-1中的每个元素都小于等于 A(q),而且,小于等于 Aq+1.r中的 元素。下标q 也在这个划分过程中进行计算。 (2)解决:通过递归调用快速排序,对子数组Ap.q-1和Aq+1.r排序 (3)合并:因为两个子数组是就地排序的,将它们的合并不需要操作,整个数组 Ap.r已排序。代码:#includeusing namespace std;void quickSort(int s, int l,

9、int r)if (lr) int i = l, j = r;int x = sl;/找一个基准数while (i j) while(i = x) / 从右向左找第一个小于x的数j-; if(i j)si+ = sj;while(i j & si x) / 从左向右找第一个大于等于x的数i+; if(i j)sj- = si;si = x;quickSort(s, l, i - 1); / 递归调用quickSort(s, i + 1, r);int main()int j = 0;cout请输入数组的长度: j;int* aArray = new intj;cout请输入原始数组:endl; for (int i = 0;i aArrayi;quickSort(aArray,0,j-1);cout排序后的数组:endl; for (int i = 0;i j;i+)cout aArrayin) /递归结束条件 output(); /相应的处理(输出结果)el

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号