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