求助,内排序归并函数实现不了
sort1.zip
(529.83 KB)
其他三个能行,就归并函数实现不了,跪求解决方法~
main.ccp文件
#include<stdio.h>
#include<time.h>
#include<dos.h>
#include "conio.h"
#include "malloc.h"
#include "string.h"
#include "stdlib.h"
#include "i.h"
#include "q.h"
#include "r.h"
#include "m.h"
#define MAX 10000
void main()
{
int N; int *a; time_t start ,end;
double usetime;
int i,j,key=1;
while(key!=0)
{
printf(" *********各种内排序的实现及比较********\n");
printf("|\t1----------插 入 排 序\t\t|\n");
printf("|\t2----------快 速 排 序\t\t|\n");
printf("|\t3----------基 数 排 序\t\t|\n");
printf("|\t4----------归 并 排 序\t\t|\n");
printf(" ***************************************\n");
printf("请选择排序方法:\n ");
scanf("%d",&i);
if(i==1)
printf("\n--------------------插 入 排 序--------------------\n");
else if(i==2)
printf("\n--------------------快 速 排 序--------------------\n");
else if(i==3)
printf("\n--------------------基 数 排 序 -------------------\n");
else if(i==4)
printf("\n--------------------归 并 排 序 -------------------\n");
if(i==3)
a=(int *)malloc((N+2)*sizeof(int));
else if(i==4)
a=(int *)malloc((N+1)*sizeof(int));
else
a=(int *)malloc(N*sizeof(int));
if(!a)
exit(1);
printf("输入随机数组长度N:\n");
scanf("%d",&N);
printf("排序的结果为:\n");
srand(time(NULL)); /*随机数发生器的初始化函数*//*if(i==4) for(j=0;j<N;j++) a[j]=rand()%1000; else*/
for(j=0;j<N;j++)
a[j]=rand()%2000;//控制随机数在2000以内
start=clock(); /*开始*/
if(i==1)
{
InsertSort(a,N);
for(j=0;j<N;j++)
printf("%d\t",a[j]);
}
else if(i==2)
{
QuickSort(a,0,N-1);
for(j=0;j<N;j++)
printf("%d\t",a[j]);
}
else if(i==3)
{
for(j=N-1;j>=0;j--)
a[j+1]=a[j];
a[0]=0;
RadixSort(a,N);
}
else if(i==4)
{
for(j=N-1;j>=0;j--)
a[j+1]=a[j];
a[0]=0;
MergeSort(a,N);
for(j=1;j<N+1;j++)
printf("%d\t",a[j]);
}
end=clock(); /*结束*/
usetime=(end-start)*1.0/CLOCKS_PER_SEC; /*使用时间的计算*/
printf("\n该排序所花的时间为:");
printf("%lf 秒\n",usetime);
putchar('\n'); free(a); i++;
}
getch();
}
归并.h文件
void merge(int r[],int h,int m,int w,int t[]);
void tgb(int s,int n,int r[],int t[]);
void MergeSort(int a[],int n)
{
int i,s=1;
int t[10000]={0};
while(s<n)
{
tgb(s,n,a,t);
s*=2;
if(s<n)
{
tgb(s,n,t,a);
s*=2;
}
else
{
i=1;
while(i<=n)
a[i]=t[i++];
}
}
}
void tgb(int s,int n,int r[],int t[])
{
int i=1;
while(i<=(n/2-s+1))
{
merge(r,i,i+s-1,i+2*s-1,t);
i=i+2*s;
}
if(i<(n-s+1))
merge(r,i,i+s-1,n,t);
else
while(i<=n) t[i]=r[i++];
}
void merge(int r[],int h,int m,int w,int t[])
{
int i,j,k;
i=h; j=m+1; k=h-1;
while(i<=m&&m<=w)
{
k++;
if(r[i]<=r[j])
t[k]=r[i++];
else
t[k]=r[j++];
}
if(i>m)
{
while(j<=w)
t[++k]=r[j++];
}
else
{
while(i<=m)
t[++k]=r[i++];
}
}
[ 本帖最后由 MapleCaesar 于 2011-6-25 10:34 编辑 ]