您的位置:首页 > 编程语言 > C语言/C++

自然归并排序 c++ (原创)

2012-03-14 20:11 176 查看
  今天复习算法, 自然归并算法令我挺感兴趣,结果网上找到的基本都不怎么准确,下面通过自己的一些修改,贴出一份正确的代码!

  自然归并中,有一些已经自然排好序的序列,我们称其为有序子序列!

void NaturalMergeSort(T aSrc[], int n)
{
  T *pTmp = new T
;
  int aiBreakPoint
; //包含各有序子序列断点
  int iBpCnt = 0; //断点数量
  aiBreakPoint[iBpCnt++] = 0; //aiBreakPoint[0]永远指向第一个元素
  for (int i=0; i<n-1 ; i++ ) //扫描断点
  {
    if(aSrc[i] > aSrc[i+1])
     aiBreakPoint[iBpCnt++] = i + 1;
  }
   aiBreakPoint[iBpCnt++] = n-1;

  while(iBpCnt > 2)//直到断点数为2
  {
    int i=0, iNewBpCnt = 1;
    for (i = 0; i < iBpCnt - 2; i += 2)
    {
      Merge(aSrc, pTmp, aiBreakPoint[i], aiBreakPoint[i+1], aiBreakPoint[i+2]);//相邻两个合并

      for (int j = aiBreakPoint[i]; j <= aiBreakPoint[i+2]; j++ ) //复制结果
        aSrc[j] = pTmp[j];

      aiBreakPoint[iNewBpCnt++] = aiBreakPoint[i+2];
    }

    if(i == iBpCnt - 2)
      aiBreakPoint[iNewBpCnt++] = aiBreakPoint[iBpCnt-1]; //处理最后的孤立点

    iBpCnt = iNewBpCnt;
  }

    delete[] pTmp;
}

void Merge(T c[], T d[], int l, int m, int r)
{
// Merge c[l:m]] and c[m:r] to d[l:r].
  int i = l, // cursor for first segment
  j = m+1, // cursor for second
  k = l; // cursor for result

// merge until i or j exits its segment
  while ((i <= m) && (j <= r))
    if (c[i] <= c[j]) d[k++] = c[i++];
    else d[k++] = c[j++];

// take care of left overs
  if (i > m) for (int q = j; q <= r; q++)
    d[k++] = c[q];
  else for (int q = i; q <= m; q++)
    d[k++] = c[q];
}


by wink.

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: