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

来源:互联网 发布:case when sql server 编辑:程序博客网 时间:2024/05/16 15:10
#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;  }    

0 0