归并排序的思考

#include <iostream>

void Merge(int r[], int r1[], int s, int m, int t);  //函数声明
void MergeSort(int r[], int r1[], int s, int t);

void main()
{
 int a[6], a1[6];
 int i;
 for(i=0; i<6; i++)
  scanf("%d", &a[i]);
 MergeSort(a, a1, 0, 5);
 for(i=0; i<6; i++)
  printf("%d ", a[i]);
 printf("\n");
 for(i=0; i<6; i++)
 printf("%d ", a1[i]);
    printf("\n");
}

void MergeSort(int r[], int r1[], int s, int t)
{
 int m;
 if(s==t) r1[s]=r[s];
 else
 {
  m=(s+t)/2;
  MergeSort(r, r1, s, m);      //归并排序前半个子序列
  MergeSort(r, r1, m+1, t);    //归并排序后半个子序列
  Merge(r1, r, s, m, t);      //合并两个已排序的子序列
 }
}

void Merge(int r[], int r1[], int s, int m, int t)  //合并两个已排序的子序列函数  
{
 int i=s, j=m+1, k=s;
 while(i<=m && j<=t)
 {
  if(r[i]<=r[j]) r1[k++]=r[i++];   //取r[i]和r[j]中的较小者放入r[k];
  else r1[k++]=r[j++];
 }
 if(i<=m)                   //若第一个子序列没处理完,则进行收尾处理
  while(i<=m)
   r1[k++]=r[i++];
 else                       //若第二个子序列没处理完,则进行收尾处理
  while(j<=t)
   r1[k++]=r[j++];
//注意:无下面词语,不能完成正确排序
/***************************************************************************************
*原因:从最深层递归开始(递归进行到只有一个元素时)返回调用Merge函数,但把已排序的结果 *
*放入r1数组中,r数组中的元素为无序,导致后面每次调用Merge函数都一样,不能正确排序。    *
***************************************************************************************/

   for(i=s; i<=t; i++)        
  r[i]=r1[i];
}

posted on 2011-06-30 15:45  carekee  阅读(470)  评论(0编辑  收藏  举报