首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一个c语言做的归并排序,排序一直不成功,希望

2012-03-28 
一个c语言做的归并排序,排序一直不成功,希望高手指点[codeC/C++][/code]#includestdio.h#includestdli

一个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语言没有引用
[解决办法]

C/C++ code
#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);    }} 

热点排行
Bad Request.