为什么这个归并排序的结果不对的 到底错在哪里

wuyuwww 2011-09-04 11:38:25
#include<stdio.h>
#include<stdlib.h>
#define N 50
typedef int ArryType[N];
ArryType L,TR1,SR;

//static c[N];

void Merge(int c[],int b[],int i,int m,int n)
{//将有序的c[i,,m]和c[m+1,,n]归并为有序的
int j,k;
for(j=m+1,k=i;i<=m&&j<=n;++k)
{
if(c[i]<c[j]) b[k]=c[i++];
else b[k]=c[j++];
}
while(i<=m)
{
b[k++]=c[i++];
}
while(j<=n)
{
b[k++]=c[j++];
}
return ;
}

void MSort(int a[],int b[],int s,int t)
{
int c[N];
int m;
if(s=t) b[s]=a[s];
else
{
m=(s+t)/2;
MSort(a,c,s,m);
MSort(a,c,m+1,t);
Merge(c,b,s,m,t);
}
return ;
}

void MergeSort(int a[],int b[],int n)
{
MSort(a,b,1,n);
return ;
}

int main(void)
{
int n,i,a[N],b[N];
//static b[N];
printf("请输入你要排序的元素个数n=");
scanf("%d",&n);
//for(i=1;i<=n;i++)
// printf("%5d",b[i]);
printf("请输入你要排序的元素:\n");
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("经过排序之后的元素为:\n");
MergeSort(a,b,n);
for(i=1;i<=n;i++)
printf("%5d",b[i]);

return 0;
}


看到网上很多归并排序的代码
但是我不理解为什么我从这个中间数组b输入结果为什么就不对了??
谁帮我瞧瞧
...全文
181 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liutengfeigo 2011-09-10
  • 打赏
  • 举报
回复
路过,不喜欢这排序算法.
jackyjkchen 2011-09-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wuyuwww 的回复:]

C/C++ code
#include<stdio.h>
#include<stdlib.h>
#define N 50
typedef int ArrType[N];
void Merge(ArrType SR,ArrType &TR,int i,int m,int n)
{
int j,k;
k=i;
for(j=m+1;i<=m&&j<=n……
[/Quote]

你用的严蔚敏的书是C语言版吧,本来不应该出现引用的,但据严蔚敏的说法是为了更好地描述算法,借用了C++的引用

引用当然是任何类型都可以,更何况数组传参后就退化成指针了,不过数组的引用确实没什么意义,因为数组一般是不更改地址的,你这里不用引用也可以,没看见你改地址
jackyjkchen 2011-09-10
  • 打赏
  • 举报
回复
算了……最近菜鸟多,很烦人,楼主态度跟他们比还算不错的
qq120848369 2011-09-04
  • 打赏
  • 举报
回复
最讨厌程序写的复杂了,怎么简洁怎么写.
nehckjykcaj 2011-09-04
  • 打赏
  • 举报
回复
我是马甲
nehckjykcaj 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wuyuwww 的回复:]

可是你没有回答我为什么 我上面的程序为什么输出结果不对
[/Quote]
#define N 50
这种限制容量的做法,我觉得没必要去修改

还不如直接看懂一个标准的程序
wuyuwww 2011-09-04
  • 打赏
  • 举报
回复
可是你没有回答我为什么 我上面的程序为什么输出结果不对
jackyjkchen 2011-09-04
  • 打赏
  • 举报
回复
我这个是排byte的,改成排int改参数,还要注意内存分撇
jackyjkchen 2011-09-04
  • 打赏
  • 举报
回复
归并是尾递归,改成循环也很容易


void merge(BYTE *array, int low, int mid, int high)
{
int i, k;
BYTE *temp = (BYTE *) malloc(high-low+1);
int begin1 = low;
int end1 = mid;
int begin2 = mid + 1;
int end2 = high;

for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)
if(array[begin1]<array[begin2])
temp[k] = array[begin1++];
else
temp[k] = array[begin2++];
while(begin1<=end1)
temp[k++] = array[begin1++];
while(begin2<=end2)
temp[k++] = array[begin2++];
for (i = 0; i < (high-low+1); i++)
array[low+i] = temp[i];
free(temp);
}

void merge_sort(BYTE *array, UINT first, UINT last)
{
UINT mid,i;
for(mid=1; mid<=last-first; mid += mid)
for(i=first; i<=last-mid; i+=mid+mid)
merge(array,i,i+mid-1,min(i+mid+mid-1,last));
}

void MergeSort(BYTE *array, UINT length)
{
merge_sort(array,0,length-1);
}
jackyjkchen 2011-09-04
  • 打赏
  • 举报
回复
简单问题搞复杂了,好好的多出个C[N]干嘛

给你个对的

void merge(BYTE *array, int low, int mid, int high)
{
int i, k;
BYTE *temp = (BYTE *) malloc(high-low+1);
int begin1 = low;
int end1 = mid;
int begin2 = mid + 1;
int end2 = high;

for (k = 0; begin1 <= end1 && begin2 <= end2; ++k)
if(array[begin1]<array[begin2])
temp[k] = array[begin1++];
else
temp[k] = array[begin2++];
while(begin1<=end1)
temp[k++] = array[begin1++];
while(begin2<=end2)
temp[k++] = array[begin2++];
for (i = 0; i < (high-low+1); i++)
array[low+i] = temp[i];
free(temp);
}

void merge_sort(BYTE *array, UINT first, UINT last)
{
int mid = 0;
if(first<last)
{
mid = (first+last)/2;
merge_sort(array, first, mid);
merge_sort(array, mid+1,last);
merge(array,first,mid,last);
}
}

void MergeSort(BYTE *array, UINT length)
{
merge_sort(array,0,length-1);
}


wuyuwww 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jackyjkchen 的回复:]
这种简单代码的bug都调不出来,我完全不相信你能看懂教材上的程序
[/Quote]

算了 哎 我好无奈 只是我这个人比较喜欢叫真把 错了就想知道为什么 可我也没觉得这样就得罪了人 抱歉啊
wuyuwww 2011-09-04
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<stdlib.h>
#define N 50
typedef int ArrType[N];
void Merge(ArrType SR,ArrType &TR,int i,int m,int n)
{
int j,k;
k=i;
for(j=m+1;i<=m&&j<=n;k++)
if(SR[i]<=SR[j]) TR[k]=SR[i++];
else TR[k]=SR[j++];
while(i<=m) TR[k++]=SR[i++];
while(j<=n) TR[k++]=SR[j++];
}
void MSort(ArrType SR,ArrType & TR1,int s,int t)
{
ArrType TR2;
int m;
if(s==t) TR1[s]=SR[s];
else
{
m=(s+t)/2;
MSort(SR,TR2,s,m);
MSort(SR,TR2,m+1,t);
Merge(TR2,TR1,s,m,t);//
}

}
void MergeSort(ArrType &L,int n)
{
MSort(L,L,1,n);
return ;
}
int main(void)
{
int n,i,j;
ArrType L;
printf("请输入你要排序的元素个数n=");
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&L[i]);
MergeSort(L,n);
for(i=1;i<=n;i++)
printf("%6d",L[i]);
return 0;
}


这个实我把严慰敏的书又看了一遍之后改的 虽然这次出结果了
可是这个里面的#define N 50
typedef int ArrType[N];
这个ArrType & TR1是对数组的引用马?怎么在我的记忆里马数组是不能引用的阿?
jackyjkchen 2011-09-04
  • 打赏
  • 举报
回复
这种简单代码的bug都调不出来,我完全不相信你能看懂教材上的程序
jackyjkchen 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wuyuwww 的回复:]

引用 5 楼 nehckjykcaj 的回复:
引用 4 楼 wuyuwww 的回复:

可是你没有回答我为什么 我上面的程序为什么输出结果不对

#define N 50
这种限制容量的做法,我觉得没必要去修改

还不如直接看懂一个标准的程序


该程序也可以提高自己的 你知道吗 那些标准的程序我看的懂 你相信吗
[/Quote]

既然态度这么冲,我只能告诉你,写垃圾代码只能获得垃圾经验
wuyuwww 2011-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 nehckjykcaj 的回复:]
引用 4 楼 wuyuwww 的回复:

可是你没有回答我为什么 我上面的程序为什么输出结果不对

#define N 50
这种限制容量的做法,我觉得没必要去修改

还不如直接看懂一个标准的程序
[/Quote]

该程序也可以提高自己的 你知道吗 那些标准的程序我看的懂 你相信吗

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧