归并排序 的非递归算法

Posted 张乐乐章

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序 的非递归算法相关的知识,希望对你有一定的参考价值。

算法思想:

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

以上是关于归并排序 的非递归算法的主要内容,如果未能解决你的问题,请参考以下文章

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(下)-- 非递归方法实现

数据结构-排序快速排序的非递归算法

高速排序 归并排序的非递归版本号 备忘

书上讲解归并排序的非递归写法

c_cpp 归并排序的非递归实现,慢于标准库

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现