首页 > 代码库 > 归并排序 的非递归算法

归并排序 的非递归算法

算法思想:

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

归并排序 的非递归算法