我写了一个常规的合并排序数组代码,我想做的就是用'asize‘调用这个函数,而不是用数字,而不是收到1 2 3 4 5 6 7 8 9 10一个常规的排序数组,我得到的是-858993460 1 2 3 4 5 6 7 8 9
请帮我找出原因
void merge_sort(int *a,int first, int last)
{
int middle;
if(first < last)
{
middle=(first+last)/2;
merge_sort(a,first,middle);
merge_sort(a,middle+1,last);
merge(a,first,middle,last);
}
}
void main()
{
int a[] = {9, 7, 2, 3, 5, 4, 1, 8, 6, 10};
int asize= (sizeof a / sizeof a[0]);
merge_sort(a, 0, asize);
For (i = 0; i < 10; i++)
printf ("%d ", a[i]);发布于 2012-01-04 05:47:28
因为您的结果数组有一个奇怪的值和一个缺失值,所以最有可能的情况是off-by-one错误,很可能是将asize作为最后一个元素的索引传递,而不是asize - 1。
合并排序所需的参数是第一个和最后一个索引(从零开始),因此,对于大小为10的数组,应该是0和9。您正在使用当前代码传递0和10。
因此,您实际上是在对“数组”进行排序:
{9, 7, 2, 3, 5, 4, 1, 8, 6, 10, ?}
\___________________________/ |
your array +-- not your array而且,因为?是-858993460 (在本例中是-858993460),所以您最终得到:
{-858993460, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
\___________________________________/ \/ not your
your array \ array然后,打印前十个元素就会得到您所看到的输出。不幸的是,无论是什么变量(或堆栈控制信息或其他任何东西)保存了这么大的负值,现在都被值10覆盖了,而不是您真正想要的东西。
你所做的是未定义的行为。马上停下来。别让我过来:-)
顺便说一句,简单的解决方法是改变:
merge_sort (a, 0, asize);进入:
merge_sort (a, 0, asize - 1);发布于 2012-01-04 05:46:20
您正在跨过数组的末尾进入垃圾。last应为asize-1,即调用merge_sort(a, 0, asize-1);。
发布于 2012-01-04 05:46:44
merge_sort(a, 0, asize);您应该发送asize-1,即从0到asize-1 elements。下面就是正确的答案!
merge_sort(a, 0, asize-1);https://stackoverflow.com/questions/8719019
复制相似问题