排序算法——归并排序

归并排序的思想很像是插入排序,只不过插入的元素是已经排序好了的数组

 

void CMergeSort::Merge(double R[], double R1[], int low, int mid, int high)
{
   int i=low,j=mid+1,k=low;
   while ((i<=mid) && (j<=high))
   {
      if (R[i] <= R[j])
      {
          R1[k++] = R[i++];
      }
      else
      {
          R1[k++] = R[j++];
      }
   }
   while (i<=mid)
   {
      R1[k++] = R[i++];
   }
   while (j<=high)
   {
      R1[k++] = R[j++];
   }
}
void CMergeSort::MergePass(double R[], double R1[], int n)
{
   int low = 0;
   int mid = low + n -1;
   int high = low + 2 * n -1;

   while (high < lenth)
   {
      Merge(R, R1, low, mid, high);
      low = high + 1;
      mid = low + n -1;
      high = low + 2 * n - 1;
   }
   //处理剩余文件
   if(mid < lenth-1)//剩余两个文件夹,其中一个长度小于lenth
   {
      Merge(R, R1, low, mid, lenth-1);
   }
   else//只有一个子文件夹
   {
      for (int i=low; i<lenth;i++)
      {
       R1[i] = R[i];
      }
   }
}
void CMergeSort::MergeSort()
{
   int n;
   n = 1;
   while (n < lenth)
   {
      MergePass(m_num, m_num1, n);
      n = 2 * n;
      MergePass(m_num1, m_num, n);
      n = 2 * n;
   }
}

 

在处理过程中要考虑的是待归并数组的边界。还有临时数组R1的引入,简化了数据频繁交换移动。

转载于:https://www.cnblogs.com/rubywang/archive/2009/03/16/1413342.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值