归并排序 的非递归算法

算法思想:

先假设length=1; 表示先将相邻的2个元素进行排序。A[0]与A[1],A[2]与A[3].............A[N-2]与A[N-1](N为偶数 假设)

然后length=2;A[0]A[1]是有序序列,与A[2]A[3] 进行2个有序序列的归并。

依次类推。

  void Merge_Pass(ElementType A[],ElementType Temp[],int N,int length)
{ int i,j;
    for(i=0;i<N-2*length;i+=2*length)
        Merge1(A,Temp,i,i+length,i+length*2-1);
    if (i+length<N)
       Merge1(A,Temp,i,i+length,N-1);//超级错误
    else
    {
        for(j=i;j<N;j++)
            Temp[j]=A[j];
    }

}

 void Merge_Sort(ElementType A[],int N)
 {
     int length;
     ElementType *Temp;
     
      Temp = (ElementType *)malloc( N * sizeof( ElementType ) );

    length=1;
     if (Temp!=NULL)
     {
         while(length<N)
         {
             Merge_Pass(A,Temp,N,length);
             length=length*2;
             Merge_Pass(Temp,A,N,length);
             length=length*2;
         }
     }
     else
         printf("error\n");
 }
 void Merge1(ElementType A[],ElementType Temp[],int  Left,int Right,int RightEnd)
{
    int temp,i, LeftEnd,count;
    LeftEnd=Right-1;
    count=RightEnd-Left+1;
    temp=Left;
    while(Left<=LeftEnd&& Right<=RightEnd)
    {
        if(A[Left]<=A[Right])
            Temp[temp++]=A[Left++];
        else
            Temp[temp++]=A[Right++];
    }
    while(Left<=LeftEnd)
        Temp[temp++]=A[Left++];
    while(Right<=RightEnd)
        Temp[temp++]=A[Right++];
    
}

错误分析:

Merge1(A,Temp,i,i+length,N);
应该有N个元素,最后一个元素的下标是N-1!!!!!!!!!!!!!
posted @ 2016-09-10 21:50  乐乐章  阅读(251)  评论(0编辑  收藏  举报