归并排序之循环归并排序9.4.3

#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<time.h>  
typedef int ElementType;  
void Merge(ElementType a[],ElementType tmpa[],int l,int r,int rend){//有序子列的归并  
int len=rend-l+1;  
int lend=r-1;  
int tmp=l;  
while(l<=lend&&r<=rend){  
    if(a[l]>a[r])  
        tmpa[tmp++]=a[r++];  
        else  
            tmpa[tmp++]=a[l++];  
  
}  
while(l<=lend)  
tmpa[tmp++]=a[l++];  
while(r<=rend)  
    tmpa[tmp++]=a[r++];  
/*for(int i=0;i<len;i++,rend--){  
  
    a[rend]=tmpa[rend];  
}  */
  
}    
  
    /* 归并排序 - 循环实现 */
    
     
    /* length = 当前有序子列的长度*/
    void Merge_pass( ElementType A[], ElementType TmpA[], int N, int length )
    { /* 两两归并相邻有序子列 */
         int i, j;
           
         for ( i=0; i <= N-2*length; i += 2*length )
             Merge( A, TmpA, i, i+length, i+2*length-1 );
         if ( i+length < N ) /* 归并最后2个子列*/
             Merge( A, TmpA, i, i+length, N-1);
         else /* 最后只剩1个子列*/
             for ( j = i; j < N; j++ ) TmpA[j] = A[j];
    }
     
    void Merge_Sort( ElementType A[], int N )
    { 
         int length; 
         ElementType *TmpA;
          
         length = 1; /* 初始化子序列长度*/
         TmpA = malloc( N * sizeof( ElementType ) );
         if ( TmpA != NULL ) {
              while( length < N ) {
                  Merge_pass( A, TmpA, N, length );
                  length *= 2;
                  Merge_pass( TmpA, A, N, length );
                  length *= 2;
              }
              free( TmpA );
         }
         else printf( "空间不足" );
    }
  
  
  
  
int main(){  
    srand(time(NULL));  
    int s[100];  
for(int i=0;i<100;i++)  
s[i]=rand()%1000;  
Merge_Sort(s,100);  
for(int i=0;i<100;i++)  
printf("%d ", s[i]);  
    return 0;  
}  
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值