我制作了这个程序来对数组进行排序。它工作正常,但它不会排序!请帮我在逻辑中找到错误。感谢
[更新]它能够工作!我刚刚按照下面的建议放下了i,j和k.Also,from i
#include <stdio.h>
#include <stdlib.h>
void mergesort(int[], int, int);
void merge(int [], int low, int mid, int hi); //function prototype
int main()
{
int arr[]={1,4,78,92,9};
mergesort(arr,0,5);
//after mergesort
for(int i=0; i<5; i++)
{
printf("%d, ", arr[i]);
}
system("pause");
return 0;
}
void mergesort(int aptr[], int low, int hi)
{
int mid =0;
int rightmax=0;
int leftmax=0;
if(low==hi)
{
return;
}
mid=(low+hi)/2;
mergesort(aptr, low, mid);
mergesort(aptr, mid+1, hi);
merge(aptr, low, mid, hi);
}
void merge(int aptr[], int low, int mid, int hi)
{
int j, i, k;
//copy contents of aptr to auxiliary b
for(i=low; i<=hi; i++)
{
bptr[i]=aptr[i];
}
// iterate through b as if they were still two arrays, lower and higher
//copy smaller elements first
i=low;
j=mid+1;
k=low;
while(i<= mid && j<=hi)
{
if(bptr[i]<=bptr[j])//<--put smaller element first
{
aptr[k++]=bptr[i++];
}
else
{
aptr[k++]=bptr[j++];
}
}
// copy back first half just in case
while(i<=mid)
{
aptr[k++]=bptr[i++];
}
}//function
答案 0 :(得分:2)
当程序执行时,语句i<= mid && j<=hi
永远不会成立,因此,永远不会输入依赖于它的while循环,并且永远不会到达实际交换元素的代码。
在其前面的for
循环后,i
等于hi
,其始终大于mid
。我猜你的意思是在输入i
循环之前将low
重置为while
。
答案 1 :(得分:1)
以下是如何启动的建议:将printf()调用放入mergesort()和merge()函数,这些函数在每个函数调用的开始和返回时显示参数。这可能会帮助你弄清楚发生了什么。要求其他人调试你的算法不会帮助你学习如何编程。
答案 2 :(得分:0)
作为一个不错的观点,我想提一下,你已经成为可能整数溢出错误的受害者:
mid=(low+hi)/2;
如果low
和/或hi
足够大,low + hi
会溢出,为mid
提供错误的值。相反,你应该这样做:
mid = low + (hi - low) / 2;