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