我写了一个常规的合并排序数组代码,我想做的就是调用它 使用'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]);
答案 0 :(得分:5)
因为你的结果数组有一个奇怪的值和一个缺失值,最可能的情况是一个一个一个错误,可能是asize
作为最后一个元素的索引而不是{{1 }}
合并排序所需的参数是第一个和最后一个索引(从零开始),因此,对于大小为10的数组,可以是asize - 1
和0
。您正在使用当前代码传递9
和0
。
因此,您实际上正在对“数组”进行排序:
10
并且,因为{9, 7, 2, 3, 5, 4, 1, 8, 6, 10, ?}
\___________________________/ |
your array +-- not your array
是?
(在这种特殊情况下),您最终得到:
-858993460
然后,打印前十个元素可以获得您正在看到的输出。不幸的是,任何变量(或堆栈控制信息或任何真正的东西)持有那么大的负值现在已经用值10覆盖,而不是你真正想要的东西。
您正在做的是未定义的行为。立即停止。不要让我过来: - )
顺便提一下,简单的方法是改变:
{-858993460, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
\___________________________________/ \/ not your
your array \ array
成:
merge_sort (a, 0, asize);
答案 1 :(得分:2)
你正在把数组的末尾踩到垃圾堆里。 last
应为asize-1
,即致电merge_sort(a, 0, asize-1);
。
答案 2 :(得分:2)
merge_sort(a, 0, asize);
您应该发送asize-1
,即从0
发送到asize-1
元素。以下是正确的!
merge_sort(a, 0, asize-1);