//The driving routine for merging leftist heaps heapnode Merge(heapnode h1, heapnode h2){ if(h1==NULL) return h2; if(h2==NULL) return h1; //To decide that which heap's root is smaller if(h1->num < h2->num) return Merge1(h1,h2); else return Merge1(h2,h1); }
// 合并左式堆的驱动函数 PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2) { if (H1 == NULL) return H2; if (H2 == NULL) return H1; // 以有较小的元素的堆为根 if (H1->Element < H2->Element) return Merge1(H1, H2); else return Merge1(H2, H1); }
/* START: fig6_26.txt */ PriorityQueue Merge( PriorityQueue H1, PriorityQueue H2 ) { /* 1*/ if( H1 == NULL ) /* 2*/ return H2; /* 3*/ if( H2 == NULL ) /* 4*/ return H1; /* 5*/ if( H1->Element < H2->Element ) /* 6*/ return Merge1( H1, H2 ); else /* 7*/ return Merge1( H2, H1 ); }
PriorityQueue Merge(PriorityQueue H1, PriorityQueue H2) { if(H1 == NULL){ return H2; } if(H2 == NULL){ return H1; } if(H1->Element < H2->Element){ return Merge1(H1, H2); }else{ return Merge1(H2, H1); } }
//非递归 void Merge_Pass(int *A,int *TmpA,int n,int length) { //length当前子序列的长度 int i,j; for(i=0;i<=n-2*length;i+=2*length) { Merge1(A,TmpA,i,i+length,i+2*length-1); } if(i+length<n)//归并最后两个数列 { Merge1(A,TmpA,i,i+length,n-1); } else//归并最后一个数列 { for(j=i;j<n;j++) { TmpA[j]=A[j]; } } }
void MSort(ElementType S[], ElementType TmpS[], long L, long RightEnd) { long Center; if (L < RightEnd) { Center = (L + RightEnd) / 2; MSort(S, TmpS, L, Center); MSort(S, TmpS, Center + 1, RightEnd); Merge1(S, TmpS, L, Center + 1, RightEnd); } }
void Merge_pass(int A[],int TempA[],int N,int length) { int i,j; for(i=0; i<=N-2*length; i+=2*length) { Merge1(A,TempA,i,i+length,i+2*length-1); } if(i+length<N) { Merge1(A,TempA,i,i+length,N-1); } else { for(j=i; j<N; j++) { TempA[j]=A[j]; } } for(j=0; j<N; j++) { A[j]=TempA[j]; } }