我知道合并排序是什么,我以前执行过它。但是,当我尝试这样做时,我几乎从未得到理想的答案。 我可以猜到最好,我无法存储最终排序的数组。 你能帮我调试一下吗?解释一下调试任何类似递归问题的方法是什么?
#include<stdio.h>
void merge(int arr[],int p,int q,int r)
{
int n1= q-p+1;//1st half
int n2= r-(q+1)+1;//2nd half
int arr2[100];
int n=p;
int ar1[n1],ar2[n2];
for(int i=p;i<=q;i++)
{
ar1[i]=arr[p+i];
}
for(int i=q+1;i<=r;i++)
{
ar1[i]=arr[p+i];
}
int i,j;
for(i=0,j=0;i<n1&&j<n2;)
{
if(ar2[j]<ar1[i]){arr2[n]=ar2[j];j++;}
else {arr2[n]=ar1[i];i++;}
n++;
}
while (i<=n1)
{
arr[n]=ar1[i];
n++;
}
while (j<=n2)
{
arr[n]=ar2[j];
n++;
}
if(p==0&&r==9)
{
for(int i=0;i<=9;i++)
{
printf("%d",arr2[i]);
}
}
}
void mergesort(int arr[], int p, int r)
{
if(p<r)
{
int q=(p+r)/2;
mergesort(arr,p,q);
mergesort(arr,q+1,r);
merge(arr,p,q,r);
}
}
int main()
{
int arr[]={2,4,13,4,0,23,54,12,6,9};
mergesort(arr,0,9);
for(int i=0;i<=9;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
答案 0 :(得分:0)
我的整体评论是&#34;整洁计数&#34;你的merge()
代码很乱。你没有看到你从ar2
中取出东西但从未放入任何东西吗?此外,arr2
不是必需的,所以要摆脱它。你的索引都错了。
你的缩进毫无价值,你期望如何调试? (除了让SO上的人为你做这件事。)想想每一行:它是否建立在之前的陈述之上;是否建立了以下声明?想想每个指数:它从哪里开始;它应该在哪里结束?你的代码解开了:
#include <stdio.h>
void merge(int array[], int p, int q, int r)
{
int n1 = q - p + 1; // 1st half
int n2 = r - (q + 1) + 1; // 2nd half
int ar1[n1], ar2[n2];
for (int i = p, j = 0; j < n1; i++, j++)
{
ar1[j] = array[i];
}
for (int i = q + 1, j = 0; j < n2; i++, j++)
{
ar2[j] = array[i];
}
int i = 0, j = 0, n = p;
for (; i < n1 && j < n2; n++)
{
if (ar2[j] < ar1[i])
{
array[n] = ar2[j++];
} else {
array[n] = ar1[i++];
}
}
while (i < n1)
{
array[n++] = ar1[i++];
}
while (j < n2)
{
array[n++] = ar2[j++];
}
}
void mergesort(int array[], int p, int r)
{
if (p < r)
{
int q = (p + r) / 2;
mergesort(array, p, q);
mergesort(array, q + 1, r);
merge(array, p, q, r);
}
}
int main()
{
int array[] = {2, 4, 13, 4, 0, 23, 54, 12, 6, 9};
int length = sizeof(array) / sizeof(int);
mergesort(array, 0, length - 1);
for (int i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
printf("\n");
return 0;
}