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

 

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的引入,简化了数据频繁交换移动。

posted on 2009-03-16 16:20  Ruby_Wang  阅读(226)  评论(0)    收藏  举报