[算法之归并排序] MergeSort

本文详细介绍了一种高效的排序算法——归并排序,并提供了具体的实现代码。文章通过两部分展开:二路归并排序与多段二路归并排序,旨在帮助读者深入理解归并排序的工作原理及其应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

// 将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、付费专栏及课程。

余额充值