#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;
}
归并排序之循环归并排序9.4.3
最新推荐文章于 2022-04-30 16:40:10 发布