我在C中进行合并排序程序,但我得到了一些意想不到的输出。 任何人都可以在程序中发现错误吗?
#include<stdio.h>
int array[100],n;
void merge(int l,int m,int h);
void mergesort(int start,int end);
main(){
int i;
printf("Enter Size: ");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&array[i]);
}
mergesort(0, n-1);
for(i=0;i<n;i++){
printf("%d\n",array[i]);
}
}
void mergesort(int start,int end){
int mid;
if(start<end){
mid=(start+end)/2;
mergesort(start,mid);
mergesort(mid+1,end);
merge(start,mid,end);
}
}
void merge(int start,int mid,int end){
int i,j,k;
int a1[100],a2[100];
for(k=0,i=start;i<=mid;i++,k++){
a1[k]=array[i];
}
for(k=0,j=i;j<=end;j++,k++){
a2[k]=array[j];
}
a1[mid]=999;
a2[j]=999;
i=0;j=0;
for(k=start; k <=end; k++)
{
if(a1[i]<=a2[j])
array[k]=a1[i++];
else
array[k]=a2[j++];
}
}
输出:
Enter Size: 5
1 2 3 2 3
2
2
3
3
-1818025592
对于较大的阵列,输出更加混乱。我认为merge()函数有错误。
答案 0 :(得分:2)
您正在错误的位置终止a1和a2阵列。
尝试更改:
for(k=0,i=start;i<=mid;i++,k++){
a1[k]=array[i];
}
for(k=0,j=i;j<=end;j++,k++){
a2[k]=array[j];
}
a1[mid]=999;
a2[j]=999;
到
for(k=0,i=start;i<=mid;i++,k++){
a1[k]=array[i];
}
a1[k]=999;
for(k=0,j=i;j<=end;j++,k++){
a2[k]=array[j];
}
a2[k]=999;
答案 1 :(得分:1)
创建临时数组时:
for (k = 0, i = start; i <= mid; i++, k++) {
a1[k] = array[i];
}
a1[i] = 999;
你在最后放了一个值很高的哨兵值。但i
是原始array
的索引。您必须使用k
,即临时数组的索引a1
:
for (k = 0, i = start; i <= mid; i++, k++) {
a1[k] = array[i];
}
a1[k] = 999;
即使如此,k
和i
的双重控制结构也很笨拙。并且没有必要猜测一个高数字; <limits.h>
具有为大多数类型的最小值和最大值定义的常量:
k = 0;
for (i = start; i <= mid; i++) {
a1[k++] = array[i];
}
a1[k] = INT_MAX;
此处,您在附加项目时增加k
。即使分配有条件地发生,即不在所有迭代中也是如此。
最后,我建议使用独占上限。这是用C表示范围的自然方式。mid
将是左数组的独占上限和右数组的包含下限。
答案 2 :(得分:0)
我已经解决了这个问题
a [mid + 1] = 999
a [k] = 999