[算法之归并排序] MergeSort

 

//  将a[p...r] 和a[r+1...q] 合并到 b[0...q-p]
void  Merge2Sort( int   * a,  int   * b,  int  p,  int  r,  int  q)
{
 
int i = p, j = r+1, k = 0;
 
while(i<=&& j<=q)
{
  
if(a[i] < a[j])
   b[k
++= a[i++];
  
else
   b[k
++= a[j++];
 }

 
while(i<=r)
  b[k
++= a[i++];
 
while(j<=q)
  b[k
++= a[j++];
}


//  多段二路合并:
// a[p...q],每len个元素为一个有序段,将这些连续有序段合并为一个有序段存入b[ ]
void  MergeMSort( int   * a,  int   * b,  int  p,  int  q,  int  len)
{
 
int i = p, j = 0, k;
 
while(i + 2*len-1 <= q)
{
  Merge2Sort(a, b
+j, i, i+len-1, i+2*len-1);
  i 
+= 2*len;
  j 
+= 2*len;
 }

 
if(i+len <=q) // Two segments
  Merge2Sort(a, b+j, i, i+len-1, q);
 
else
  
for(k=i; k<=q; k++)
   b[j
++= a[k];
}

//  a[p...q] 归并排序 using by b[0...q-p]
void  MergeSort( int   * a,  int *  b,  int  p,  int  q)
{
 
int len = 1;
 
while(len < q-p+1)
{
  
// a[p...q] -> b[0...q-p]
  MergeMSort(a, b, p, q, len);  
  len 
*= 2;
  
// b[0...q-p] -> a[p...q]
  MergeMSort(b, a+p, 0, q-p, len);
 }
 
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值