zoukankan      html  css  js  c++  java
  • 归并排序 的非递归算法

    算法思想:

    先假设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
    ");
     }
     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!!!!!!!!!!!!!
  • 相关阅读:
    面试题库
    集合的交、查、并
    mysql_server安装
    maven构建jar包
    Centos7下 升级php5.4到7.1 yum安装
    redis
    常见shell用法
    Mac下的LDAP客户端 ApacheDirectoryStudio
    redis弱密码漏洞利用
    Freeradius+Cisco2500AC+OpenLdap认证
  • 原文地址:https://www.cnblogs.com/zle1992/p/5860390.html
Copyright © 2011-2022 走看看