算法导论习题Word格式文档下载.docx
- 文档编号:18814150
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:33
- 大小:20.75KB
算法导论习题Word格式文档下载.docx
《算法导论习题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《算法导论习题Word格式文档下载.docx(33页珍藏版)》请在冰豆网上搜索。
=i*3+1)
{
if(a[s]<
a[s-1])
tmp=a[s],a[s]=a[s-1],a[s-1]=tmp;
s--;
}
}
}
第一步对4个长度3的子列表进行插入排序的结果为:
printf("
%d,"
a[i]);
MERGE_SORT(a,0,3,3);
第二步对4个子列表进行合并排序的结果为:
}
voidMERGE_SORT(inta[],intp,intr,intk)
voidMERGE(inta[],intp,intq,intr,intk);
intq;
if(p<
r)
q=(p+r)/2;
MERGE_SORT(a,p,q,k);
MERGE_SORT(a,q+1,r,k);
MERGE(a,p,q,r,k);
voidMERGE(inta[],intp,intq,intr,intk)
intn1=(q-p+1)*k,n2=(r-q)*k;
int*L=newint[n1];
int*R=newint[n2];
n1;
L[i]=a[p*k+i];
for(j=0;
n2;
R[j]=a[(q+1)*k+j];
i=0;
j=0;
for(s=p*3;
s<
=(r+1)*3-1;
s++)
if(i>
n1-1)
a[s]=R[j++];
elseif(j>
n2-1)
a[s]=L[i++];
elseif(L[i]<
R[j])
else
2-4:
//用分治法在数组中查找逆序对
intcount_inversion(inta[],intp,intr);
inta[5]={5,4,3,2,1};
数组的逆序对是%d个\n"
count_inversion(a,0,4));
intmerge_inversion(inta[],intp,intq,intr)
{
intn1=q-p+1;
intn2=r-q;
inti,j,k,v;
++i)
L[i]=a[p+i];
++j)
R[j]=a[q+1+j];
v=0;
for(k=p;
k<
=r;
++k)
{
if(i>
n1-1)
a[k]=R[j++];
elseif(j>
n2-1)
a[k]=L[i++];
elseif(L[i]>
R[j])
v+=n1-i;
}
else
deleteL;
deleteR;
returnv;
}
intcount_inversion(inta[],intp,intr)
intv=0,q;
r)
q=(p+r)/2;
v+=count_inversion(a,p,q);
v+=count_inversion(a,q+1,r);
v+=merge_inversion(a,p,q,r);
6-1:
//用插入方法建堆
#include"
stdio.h"
voidHEAP_INCREASE_KEY(inta[],inti,intkey)
inttmp;
if(key>
a[i-1])
a[i-1]=key;
while(i>
1&
&
a[i/2-1]<
tmp=a[i/2-1],a[i/2-1]=a[i-1],a[i-1]=tmp;
i=i/2;
voidMAX_HEAP_INSERT(inta[],intkey,intheap_size)
heap_size+=1;
a[heap_size-1]=0;
HEAP_INCREASE_KEY(a,heap_size,key);
voidBUILD_MAX_HEAP(inta[],intlengh)
intheap_size=1;
inti;
for(i=2;
=lengh;
MAX_HEAP_INSERT(a,a[i-1],heap_size);
heap_size++;
//堆的长度要随着循环的次数增长
intj;
inta[10]={15,84,62,16,29,35,6,18,9,17};
BUILD_MAX_HEAP(a,10);
10;
%d\n"
a[j]);
6-2c:
voidMAX_D_HEAPIFY(inta[],inti,intd,intheap_size)
intn=d,j,largest;
int*child=newint[n];
n;
child[j]=(i-1)*d+2+j;
if(child[0]<
=heap_size&
a[child[0]-1]>
largest=child[0];
else
largest=i;
for(j=1;
if(child[j]<
a[child[j]-1]>
a[largest-1])
largest=child[j];
if(largest!
=i)
tmp=a[largest-1],a[largest-1]=a[i-1],a[i-1]=tmp;
MAX_D_HEAPIFY(a,largest,d,heap_size);
voidBUILD_MAX_D_HEAP(inta[],intd,intheap_size)
inti,j;
j=heap_size%d;
if(j==0||j==1)
i=heap_size/d;
i=heap_size/d+1;
//由叶子节点求父节点有两种情况
for(i;
i>
=1;
i--)
MAX_D_HEAPIFY(a,i,d,heap_size);
intEXTRACT_MAX(inta[],intd,intheap_size)
tmp=a[heap_size-1];
a[heap_size-1]=a[0];
a[0]=tmp;
heap_size--;
MAX_D_HEAPIFY(a,1,d,heap_size);
returna[heap_size];
inta[20]={52,47,16,58,23,26,14,18,59,68,47,19,35,29,61,82,74,75,98,81};
//intb[18]={25,11,15,9,8,17,21,40,18,11,10,20,14,15,19,21,7,10};
intd=5,j,largest;
BUILD_MAX_D_HEAP(a,5,20);
//BUILD_MAX_D_HEAP(b,5,18);
20;
largest=EXTRACT_MAX(a,5,20);
largest);
/*for(j=0;
18;
b[j]);
*/
6-2d:
j=heap_size/d;
voidHEAP_INCREASE_KEY(inta[],inti,intd,intkey)
inttmp,j;
if(a[i-1]<
=key)
1)
if(i%d==0||i%d==1)
j=i/d;
j=i/d+1;
if(a[j-1]<
tmp=a[j-1],a[j-1]=a[i-1],a[i-1]=tmp;
i=j;
elsebreak;
voidINSERT(inta[],intkey,intd,intheap_size)
HEAP_INCREASE_KEY(a,heap_size,d,key);
intj,s=0;
BUILD_MAX_D_HEAP(a,5,19);
s+=1;
if(s%6==0)
printf("
INSERT(a,a[19],5,19);
s=0;
6-2e:
voidHEAP_DECREASE_KEY(inta[],inti,intd,intkey,intheap_size)
if(a[i-1]>
MAX_D_HEAPIFY(a,i,d,heap_size);
intkey=1,s=0,j;
HEAP_DECREASE_KEY(a,3,5,key,20);
6-5-7:
//inta[10]={6,4,12,7,9,11,5,13,18,8};
inta[10]={20,18,17,14,16,10,8,9,8,15};
inti=9,j;
intheap_size;
voidBULD_MAX_HEAP(inta[]);
intHEAP_DELETE(inta[],inti);
BULD_MAX_HEAP(a);
heap_size=HEAP_DELETE(a,i);
删除第i个元素后的堆是:
heap_size;
voidBULD_MAX_HEAP(inta[])
voidMAX_HEAPIFY(inta[],intj,intheap_size);
intheap_size=10;
for(j=4;
j>
=0;
j--)
MAX_HEAPIFY(a,j,heap_size);
堆a是:
%4d"
voidMAX_HEAPIFY(inta[],intj,intheap_size)
intleft=2*(j+1);
intright=2*(j+1)+1;
//结点与数组下标之间要转换
intlargest=0,temp;
if(left<
a[left-1]>
a[j])
largest=left-1;
largest=j;
if(right<
a[right-1]>
a[largest])
largest=right-1;
=j)
temp=a[largest];
a[largest]=a[j];
a[j]=temp;
MAX_HEAPIFY(a,largest,heap_size);
intHEAP_DELETE(inta[],inti)
inttemp,key=a[9],key1=a[i-1];
temp=a[9];
a[9]=a[i-1];
a[i-1]=temp;
key1)
while(i>
a[i-1])//如果a[9]大于i结点的值,则通过不断与父结点的比较//来确它的位置
{
temp=a[i/2-1],a[i/2-1]=a[i-1],a[i-1]=temp;
i=i/2;
MAX_HEAPIFY(a,i-1,heap_size);
//如果a[9]比i结点的值要小,则从i结点开始堆维护
returnheap_size;
6-最小堆:
//建立最小堆
voidMIN_HEAPIFY(inta[],inti,intheap_size)
intsmall,tmp;
intleft=2*i,right=2*i+1;
small=left;
small=i;
a[small-1])
small=right;
if(small!
tmp=a[small-1],a[small-1]=a[i-1],a[i-1]=tmp;
MIN_HEAPIFY(a,small,heap_size);
voidBUILD_MIN_HEAP(inta[],intheap_size)
for(i=(heap_size/2);
MIN_HEAPIFY(a,i,heap_size);
voidHEAPSORT(inta[],intlengh)
inti,tmp;
intheap_size=lengh;
BUILD_MIN_HEAP(a,heap_size);
for(i=lengh;
=2;
tmp=a[i-1],a[i-1]=a[0],a[0]=tmp;
heap_size--;
MIN_HEAPIFY(a,1,heap_size);
inta[10]={23,6,21,3,7,5,8,54,14,10};
HEAPSORT(a,10);
7-1:
//PARTITION的最初版本
intHOARE_PARTITION(inta[],intp,intr)
intx,tmp;
x=a[p-1];
i=p-1;
j=r+1;
while
(1)
while(a[--j-1]>
x);
while(a[++i-1]<
if(i<
j)
tmp=a[i-1],a[i-1]=a[j-1],a[j-1]=tmp;
else
returnj;
voidQUICK_SORT(inta[],intp,intr)
q=HOARE_PARTITION(a,p,r);
QUICK_SORT(a,p,q);
QUICK_SORT(a,q+1,r);
inta[20]={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);
7-4-5:
/*对插入排序来说,当其输入已“几乎”排好序时,运行时间是很快的。
在实践中,
可以充分利用这一特点来改善快速排序的运行时间。
当在一个长度小于k的子数组上
调用快速排序时,不让他做任何排序就返回。
当顶层的快速排序调用返回后,堆对整个数
组运行插入排序来完成排序过程。
证明这一排序算法的期望运行时间是O(nk+nlg(n/k))。
在理论上和实践中,应如何选择k?
intPARTITION(inta[],intp,intr)
inti=p-1,j;
x=a[r-1];
fo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 导论 习题