码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序 的非递归算法

时间:2016-09-10 22:04:03      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

算法思想:

先假设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!!!!!!!!!!!!!

归并排序 的非递归算法

标签:

原文地址:http://www.cnblogs.com/zle1992/p/5860390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!