ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:20.75KB ,
资源ID:5827099      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/5827099.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法导论习题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法导论习题.docx

1、算法导论习题2-1:/在合并排序中对小数组采用插入排序#includevoid main() void MERGE_SORT(int a,int p,int r,int k); int a12; /=3,0,1,10,9,5,4,12,7,8,2,6; int k=3,n=12; int i,j,s; int tmp=0; printf(请输入12个正整数:n); for(i=0;i12;i+) scanf(%d,&ai); for(i=0;i=3;i+) for(j=i*3+1;j=i*3+1) if(asas-1) tmp=as,as=as-1,as-1=tmp; s-; printf(第

2、一步对4个长度3的子列表进行插入排序的结果为:n); for(i=0;i12;i+) printf(%d,ai); printf(n); MERGE_SORT(a,0,3,3); printf(第二步对4个子列表进行合并排序的结果为:n); for(i=0;i12;i+) printf(%d,ai); printf(n);void MERGE_SORT(int a,int p,int r,int k) void MERGE(int a,int p,int q,int r,int k); int q; if(pr) q=(p+r)/2; MERGE_SORT(a,p,q,k); MERGE_SO

3、RT(a,q+1,r,k); MERGE(a,p,q,r,k); void MERGE(int a,int p,int q,int r,int k) int n1=(q-p+1)*k,n2=(r-q)*k; int i,j,s; int *L=new intn1; int *R=new intn2; for(i=0;in1;i+) Li=ap*k+i; for(j=0;jn2;j+) Rj=a(q+1)*k+j; i=0; j=0; for(s=p*3;sn1-1) as=Rj+; else if(jn2-1) as=Li+; else if(LiRj) as=Li+; else as=Rj+

4、; 2-4:/用分治法在数组中查找逆序对#includevoid main() int count_inversion(int a,int p,int r); int a5=5,4,3,2,1; printf(数组的逆序对是%d个n,count_inversion(a,0,4);int merge_inversion(int a,int p,int q,int r) int n1=q-p+1; int n2=r-q; int *L=new intn1; int *R=new intn2; int i,j,k,v; for(i=0;in1;+i) Li=ap+i; for(j=0;jn2;+j)

5、 Rj=aq+1+j; i=0; j=0; v=0; for(k=p;kn1-1) ak=Rj+; else if(jn2-1) ak=Li+; else if(LiRj) ak=Rj+; v+=n1-i; else ak=Li+; delete L; delete R; return v; int count_inversion(int a,int p,int r) int v=0,q; if(pai-1) ai-1=key; while(i1&ai/2-1ai-1) tmp=ai/2-1,ai/2-1=ai-1,ai-1=tmp; i=i/2; void MAX_HEAP_INSERT(i

6、nt a,int key,int heap_size) heap_size+=1; aheap_size-1=0; HEAP_INCREASE_KEY(a,heap_size,key);void BUILD_MAX_HEAP(int a,int lengh) int heap_size=1; int i; for(i=2;i=lengh;i+) MAX_HEAP_INSERT(a,ai-1,heap_size); heap_size+; /堆的长度要随着循环的次数增长 void main() int j; int a10=15,84,62,16,29,35,6,18,9,17; BUILD_M

7、AX_HEAP(a,10); for(j=0;j10;j+) printf(%dn,aj);6-2c:#includestdio.hvoid MAX_D_HEAPIFY(int a,int i,int d,int heap_size) int n=d,j,largest; int tmp; int *child=new intn; for(j=0;jn;j+) childj=(i-1)*d+2+j; if(child0ai-1) largest=child0; else largest=i; for(j=1;jn;j+) if(childjalargest-1) largest=childj;

8、 if(largest!=i) tmp=alargest-1,alargest-1=ai-1,ai-1=tmp; MAX_D_HEAPIFY(a,largest,d,heap_size); void BUILD_MAX_D_HEAP(int a,int d,int heap_size) int i,j; j=heap_size%d; if(j=0|j=1) i=heap_size/d; else i=heap_size/d+1;/由叶子节点求父节点有两种情况 for(i;i=1;i-) MAX_D_HEAPIFY(a,i,d,heap_size);int EXTRACT_MAX(int a,i

9、nt d,int heap_size) int tmp; tmp=aheap_size-1;aheap_size-1=a0;a0=tmp; heap_size-; MAX_D_HEAPIFY(a,1,d,heap_size); return aheap_size;void main() int a20=52,47,16,58,23,26,14,18,59,68,47,19,35,29,61,82,74,75,98,81; / int b18=25,11,15,9,8,17,21,40,18,11,10,20,14,15,19,21,7,10; int d=5,j,largest; BUILD_

10、MAX_D_HEAP(a,5,20); / BUILD_MAX_D_HEAP(b,5,18); for(j=0;j20;j+) printf(%dn,aj); largest=EXTRACT_MAX(a,5,20); for(j=0;j20;j+) printf(%dn,aj); printf(%dn,largest); /* for(j=0;j18;j+) printf(%dn,bj);*/6-2d:#includestdio.hvoid MAX_D_HEAPIFY(int a,int i,int d,int heap_size) int n=d,j,largest; int tmp; in

11、t *child=new intn; for(j=0;jn;j+) childj=(i-1)*d+2+j; if(child0ai-1) largest=child0; else largest=i; for(j=1;jn;j+) if(childjalargest-1) largest=childj; if(largest!=i) tmp=alargest-1,alargest-1=ai-1,ai-1=tmp; MAX_D_HEAPIFY(a,largest,d,heap_size); void BUILD_MAX_D_HEAP(int a,int d,int heap_size) int

12、i,j; j=heap_size/d; if(j=0|j=1) i=heap_size/d; else i=heap_size/d+1;/由叶子节点求父节点有两种情况 for(i;i=1;i-) MAX_D_HEAPIFY(a,i,d,heap_size);void HEAP_INCREASE_KEY(int a,int i,int d,int key) int tmp,j; if(ai-11) if(i%d=0|i%d=1) j=i/d; else j=i/d+1; if(aj-1ai-1) tmp=aj-1,aj-1=ai-1,ai-1=tmp; i=j; else break; void

13、 INSERT(int a,int key,int d,int heap_size) heap_size+=1; aheap_size-1=0; HEAP_INCREASE_KEY(a,heap_size,d,key);void main() int a20=52,47,16,58,23,26,14,18,59,68,47,19,35,29,61,82,74,75,98,81; int j,s=0; BUILD_MAX_D_HEAP(a,5,19); for(j=0;j20;j+) printf(%d,aj); s+=1; if(s%6=0) printf(n); INSERT(a,a19,5

14、,19); s=0; printf(n); for(j=0;j20;j+) printf(%d,aj); s+=1; if(s%6=0) printf(n); 6-2e:#includestdio.hvoid MAX_D_HEAPIFY(int a,int i,int d,int heap_size) int n=d,j,largest; int tmp; int *child=new intn; for(j=0;jn;j+) childj=(i-1)*d+2+j; if(child0ai-1) largest=child0; else largest=i; for(j=1;jn;j+) if

15、(childjalargest-1) largest=childj; if(largest!=i) tmp=alargest-1,alargest-1=ai-1,ai-1=tmp; MAX_D_HEAPIFY(a,largest,d,heap_size); void BUILD_MAX_D_HEAP(int a,int d,int heap_size) int i,j; j=heap_size/d; if(j=0|j=1) i=heap_size/d; else i=heap_size/d+1;/由叶子节点求父节点有两种情况 for(i;i=1;i-) MAX_D_HEAPIFY(a,i,d,

16、heap_size);void HEAP_DECREASE_KEY(int a,int i,int d,int key,int heap_size) if(ai-1=key) ai-1=key; MAX_D_HEAPIFY(a,i,d,heap_size);void main() int a20=52,47,16,58,23,26,14,18,59,68,47,19,35,29,61,82,74,75,98,81; int key=1,s=0,j; BUILD_MAX_D_HEAP(a,5,20); for(j=0;j20;j+) printf(%d,aj); s+=1; if(s%6=0)

17、printf(n); printf(n); s=0; HEAP_DECREASE_KEY(a,3,5,key,20); for(j=0;j20;j+) printf(%d,aj); s+=1; if(s%6=0) printf(n); 6-5-7:#includestdio.hvoid main() /int a10=6,4,12,7,9,11,5,13,18,8; int a10=20,18,17,14,16,10,8,9,8,15; int i=9,j; int heap_size; void BULD_MAX_HEAP(int a); int HEAP_DELETE(int a,int

18、i); BULD_MAX_HEAP(a); heap_size=HEAP_DELETE(a,i); printf(删除第i个元素后的堆是:n); for(j=0;j=0;j-) MAX_HEAPIFY(a,j,heap_size); printf(堆a是:n); for(j=0;jheap_size;j+) printf(%4d,aj); printf(n);void MAX_HEAPIFY(int a,int j,int heap_size) int left=2*(j+1); int right=2*(j+1)+1;/结点与数组下标之间要转换 int largest=0,temp; if(

19、leftaj) largest=left-1; else largest=j; if(rightalargest) largest=right-1; if(largest!=j) temp=alargest;alargest=aj;aj=temp; MAX_HEAPIFY(a,largest,heap_size); int HEAP_DELETE(int a,int i) int temp,key=a9,key1=ai-1; int heap_size=10; temp=a9;a9=ai-1;ai-1=temp; heap_size-; if(keykey1) while(i1&ai/2-1a

20、i-1)/如果a9大于i结点的值,则通过不断与父结点的比较 /来确它的位置 temp=ai/2-1,ai/2-1=ai-1,ai-1=temp; i=i/2; else MAX_HEAPIFY(a,i-1,heap_size);/如果a9比i结点的值要小,则从i结点开始堆维护 return heap_size;6-最小堆:/建立最小堆#includestdio.hvoid MIN_HEAPIFY(int a,int i,int heap_size) int small,tmp; int left=2*i,right=2*i+1; if(leftai-1) small=left; else sm

21、all=i; if(rightasmall-1) small=right; if(small!=i) tmp=asmall-1,asmall-1=ai-1,ai-1=tmp; MIN_HEAPIFY(a,small,heap_size); void BUILD_MIN_HEAP(int a,int heap_size) int i; for(i=(heap_size/2);i=1;i-) MIN_HEAPIFY(a,i,heap_size);void HEAPSORT(int a,int lengh) int i,tmp; int heap_size=lengh; BUILD_MIN_HEAP

22、(a,heap_size); for(i=lengh;i=2;i-) tmp=ai-1,ai-1=a0,a0=tmp; heap_size-; MIN_HEAPIFY(a,1,heap_size); void main() int a10=23,6,21,3,7,5,8,54,14,10; int i; HEAPSORT(a,10); for(i=0;ix); while(a+i-1x); if(ij) tmp=ai-1,ai-1=aj-1,aj-1=tmp; else return j; void QUICK_SORT(int a,int p,int r) int q; if(pr) q=H

23、OARE_PARTITION(a,p,r); QUICK_SORT(a,p,q); QUICK_SORT(a,q+1,r); void main() int i; int a20=10,58,46,23,26,48,47,59,68,23,12,19,17,24,43,81,76,72,98,46; QUICK_SORT(a,1,20); for(i=0;i20;i+) printf(%dn,ai);7-4-5:/*对插入排序来说,当其输入已“几乎”排好序时,运行时间是很快的。在实践中,可以充分利用这一特点来改善快速排序的运行时间。当在一个长度小于k的子数组上调用快速排序时,不让他做任何排序就返回。当顶层的快速排序调用返回后,堆对整个数组运行插入排序来完成排序过程。证明这一排序算法的期望运行时间是O(nk+nlg(n/k)。在理论上和实践中,应如何选择k?*/#includestdio.hint PARTITION(int a,int p,int r) int i=p-1,j; int x,tmp; x=ar-1; fo

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1