merge.h
#ifndef MERGE_H_INCLUDED
#define MERGE_H_INCLUDED
#define MAXSIZE 1000
typedef struct
{
int R[MAXSIZE];
int length;
} sqlist;
typedef sqlist *Sqlist;
void mergepass(int SR[],int TR[],int s,int n);
void mergesort(Sqlist L);
void Merge(int s[],int t[],int i,int j,int k); /**< 合并函数 */
#endif // MERGE_H_INCLUDED
merge.c
#include <stdio.h>
#include <malloc.h>
#include "merge.h"
void mergesort(Sqlist L)
{
int *TR=(int*)malloc((L->length+1) * sizeof(int));
int k=1;
while(k<L->length)
{
mergepass(L->R,TR,k,L->length );
k=2*k;
mergepass(TR,L->R,k,L->length );
k=2*k;
}
}
void mergepass(int SR[],int TR[],int s,int n)
{
int i=1;
int j;
while(i < n-2*s+1)
{
Merge(SR,TR,i,i+s-1,i+2*s-1); //i的增长速度为s*2
i=i+2*s;
}
if(i < n-s+1)
Merge(SR,TR,i,i+s-1,n);
else
for(j=i;j <=n; j++) //J初值为i,需注意,不可写为1.
TR[j]=SR[j];
}
void Merge(int SR[],int TR[],int i,int m,int n)
{
int j,k,l;
for(j=m+1,k=i;i<=m && j<=n; k++)/**< 判断语句如为 k<=m && j<=n; 将会出错,中间两个数值将无法归并 */
{
if(SR[i] <=SR[j])
TR[k]=SR[i++];
else
TR[k]=SR[j++];
}
if(i <=m)
{
for( ;i<=m;)
TR[k++]=SR[i++];
}
if(j<=n)
{
for( ;j<=n;)
TR[k++]=SR[j++];
}
}
main.c
#include <stdio.h>
#include <stdlib.h>
#include "merge.c"
int main()
{
int i;
int d[10]={50,30,21,44,76,52,78,42,88,90};
Sqlist L=(Sqlist )malloc(sizeof(sqlist));
L->R[0]=L->length=10;
for(i=0;i <10;i++)
{
L->R[i+1]=d[i];
}
mergesort( L);
for(i=1;i <=10;i++)
printf("%d\t",L->R[i]);
getchar() ;
return 0;
}