70 likes | 175 Views
归并排序. 1. 一次二路归并排序 void merge(elemtype x[],elemtype swap[],int k,int n) /* 对序列 x[0]--x[n-1] 进行一次二路归并排序,每个有序子序列的长度为 k */ { int I,j,l1,u1,l2,u2,m ; l1=0; m=0;. while(l1+k<=n-1) { l2=l1+k; u1=l2-1; u2=(l2+k-1<=n-1)?l2+k-1:n-1; for(I=l1,j=l2;I<=u1&& j<=u2 ;
E N D
归并排序 • 1.一次二路归并排序 • void merge(elemtype x[],elemtype swap[],int k,int n) • /*对序列x[0]--x[n-1]进行一次二路归并排序,每个有序子序列的长度为k*/ • { int I,j,l1,u1,l2,u2,m ; • l1=0; • m=0;
while(l1+k<=n-1) • { l2=l1+k; • u1=l2-1; • u2=(l2+k-1<=n-1)?l2+k-1:n-1; • for(I=l1,j=l2;I<=u1&& j<=u2 ; • m ++) • { if(x[I].key<=x[j].key) • { swap[m]=x[I]; • I++; • }
else{ • swap[m]=x[j]; • j++; • } • } • /*序列2已归并完,将序列1中剩余的记录顺序存放到数组swap中*/ • while(I<=u1) • { swap[m]=x[I]; • m++;
I++; • } • /*序列1已归并完,将序列2中剩余的记录顺序存放到数组swap中*/ • while(j<=u2) • { swap[m]=x[j]; • m++; • j++; • } • l1=u2+1; • }
/*将原始序列中不足二组的记录顺序存放到数组swap中*//*将原始序列中不足二组的记录顺序存放到数组swap中*/ • for(I=l1;I<n;I++,m++) • swap[m]=x[I]; • } • 2.二路归并排序 • void mergesort(elemtype x[], • elemtype swap[],int n) • /*用二路归并排序法对记录x[0]--x[n-1]排序*/
{ int I,k; • /*归并长度由1开始*/ • k=1; • while(k<n) • { merge(x,swap,k,n); • /*将记录从数组swap放回x中*/ • for(I=0;I<n;I++) • x[I]=swap[I]; • /*归并长度加倍*/ • k=k*2;
} • }