归并排序的实现(内部)以及应用场景(外部)

归并排序既可以进行内部排序也可以进行外部排序。归并排序的时间复杂度O(N*lgN),空间复杂度为O(N)

在这种情况下可以使用外部归并排序:

若外存中还有N个文件记录,不能一次性读入内存,可以将外存中的文件记录分成若干长度为L的可以读进内存的段,并依次读入内存进行内部排序,将有序子文件(归并段)重新写入外存。然后对归并段进行逐趟归并,使归并段由小到大直到有序。但是在外部排序中实现两两归并时因为不能将两个有序段及归并结果段同时放在内存中,所以最主要的是进行外存的读写。

//内部归并排序的主要代码

 

void Mergeselction(int*a, int*tmp, int begin1, int end1, int begin2, int end2)//将两个归并段,归并成一个有序的归并段
{
   assert(a);
   int index = begin1;
   while (begin1 <= end1&&begin2 <=end2)
   {
      if (a[begin1 ]<=a[begin2])
      {
         tmp[index++] = a[begin1++];
      }
      else
      {
          tmp[index++] = a[begin2++];
      }
  }
  while (begin1 <=end1)
  {
     tmp[index++] = a[begin1++];
  }
  while (begin2<=end2)
  {
     tmp[index++] = a[begin2++];
   }
}



void _MergeSort(int*a, int *tmp,int left, int right)
{
   assert(a);
   if (left < right)
   {
     int mid = left + (right - left) / 2;
     _MergeSort(a, tmp, left, mid);
     _MergeSort(a, tmp, mid + 1, right);
     Mergeselction(a, tmp, left, mid, mid + 1, right);
     memcpy(a + left, tmp + left, (right - left + 1)*sizeof(int));
  }
}

//
void MergeSort(int *a, size_t size)
{
   int *tmp = new int[size];
   _MergeSort(a, tmp, 0, size - 1);
   delete[] tmp;
}

 

转载于:https://www.cnblogs.com/Blog-day/p/5377846.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值