一个c语言做的归并排序,排序一直不成功,希望高手指点
[code=C/C++][/code]#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20//一个用作示例的小顺序表的最大长度
#define OK 1
#define error 0
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
//typedef char Infotype;
typedef int Status;
typedef int keytype;
/*struct RedType{
keytype key;//struct Redtype r[MAXSIZE+1]
Infotype othertype;//这是定义与初始化结构体数组的方法例子。
};*/
typedef struct RedType{
keytype key;//关键字
//Infotype othertype;//其他数据项
}RedType;//记录类型
typedef struct{
struct RedType r[MAXSIZE+1];//r[0]闲置或用作哨兵的作用
int length;//顺序表的长度
}Sqlist;
Status InitSqlist(Sqlist &L)//顺序表的建立.
{
int i,n;
printf("请输入你想输入数据的长度:");
scanf("%d",&n);
L.length=n;
printf("请输入数据:\n");
for(i=1;i<=n;i++)
{
scanf("%d",&L.r[i].key);
}
return OK;
}
void Prin(Sqlist L,int cmp,int change)//输出函数
{
int i;
for(i=1;i<=L.length;i++)
printf("%d\n",L.r[i].key);
printf("此排序算法的关键字比较次数为:%d\n",cmp);
printf("此排序算法的关键字交换次数为:%d\n",change);
}
void Merge(RedType SR[],RedType TR[],int i,int m,int n,int &cmp,int &change)
{
int k,j;
for(j=m+1,k=i;i<m&&j<=n;k++){
if(LQ(SR[i].key,SR[j].key))
{TR[k]=SR[i];i++;}
else
{TR[k]=SR[j];j++;}
cmp++;
change++;
}
/*if(i<=m)
for(;k<=n&&i<=m;k++,i++)
TR[k]=SR[i];
if(j<=n)
for(;k<=n&&j<=n;k++,j++)
TR[k]=SR[j];
*/
while(i<=m)
{
TR[k]=SR[i];
k++;
i++;
}
while(j<=n)
{
TR[k]=SR[j];
k++;
j++;
}
}
void MSort(RedType SR[],RedType TR1[],int s,int t,int &cmp,int &change)
{
int m;
RedType TR2[MAXSIZE];
if(s==t)
TR1[s]=SR[s];
else{
m=(s+t)/2;
MSort(SR,TR2,s,m,cmp,change);
MSort(SR,TR2,m+1,t,cmp,change);
Merge(TR2,TR1,s,m,t,cmp,change);
}
}
void MergeSort(Sqlist &L,int &cmp,int &change)
{
int i;
RedType L2[MAXSIZE];
for(i=1;i<=L.length;i++)
L2[i]=L.r[i];
MSort(L2,L.r,1,L.length,cmp,change);
}
void main()
{
Sqlist L;
int b,c;
b=c=0;//初始化b,c=0
InitSqlist(L);
MergeSort(L,b,c);
printf("\n");
Prin(L,b,c);
}
[解决办法]
看看你的main()函数就知道你写的东西编译都过不了
void main()
{
Sqlist L;
int b,c;
b=c=0; //初始化b,c=0
InitSqlist(L);
MergeSort(L,b,c);
printf("\n");
Prin(L,b,c);
}
你看看上面那两个函数的参数是否和你声明时候是一致的
[解决办法]
我也认为
Status InitSqlist(Sqlist &L)
void Merge(RedType SR[],RedType TR[],int i,int m,int n,int &cmp,int &change)
C语言这样定义是不对的!
[解决办法]
C语言没有引用
[解决办法]
#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 50000 //定义排序数组的个数#define N2 5000void merge(int [],int,int,int);//归并排序数组合并函数声明void mergesort(int [],int,int);//归并排序数组排序函数声明//主函数void main(){ int i,a[N],a1[N],b[N2],b1[N2];//(已修改)增加了两个用来存储临时数据的数组 double t1,t2,t3,t4; for(i=0;i<N;i++) { a[i]=rand()%N;//使用随机数作为参数 a1[i]=rand()%N;//(修改)***************************** } for(i=0;i<N2;i++) { b[i]=i;//使用已经排好序的一组数作为参数 b1[i]=i; } //归并排序N个随机数字所用的时间 t2=clock(); mergesort(a1,0,N-1);//(修改)***************************** t2=clock()-t2; //归并排序N2个已经排序的数字所用的时间 t4=clock(); mergesort(b1,0,N2-1);//(修改)***************************** t4=clock()-t4; printf("\n归并排序%d个随机数字所用时间为:%f毫秒\n",N,(double)t2); printf("\n归并排序%d个已经排序数字所用时间为:%f毫秒\n\n",N2,(double)t4);}//归并排序//归并排序合并数组函数的具体实现void merge(int a[],int low,int middle,int high){ int h,i,j,k; int b[N]; h=low; i=low; j=middle+1; while(h<=middle&&j<=high) { if(a[h]<=a[j]) { b[i]=a[h]; h++; } else { b[i]=a[j]; j++; } i++; } if(h>middle) for(k=j;k<=high;k++) { b[i]=a[k]; i++; } else { for(k=h;k<=middle;k++) { b[i]=a[k]; i++; } } for(k=low;k<=high;k++) { a[k]=b[k]; }}//归并排序函数的具体实现void mergesort(int a[],int low,int high){ int middle; if(low<high) { middle=(low+high)/2; mergesort(a,low,middle); mergesort(a,middle+1,high); merge(a,low,middle,high); }}