错误的合并排序结果

Ale*_*xxx 1 c

我写了一个常规的合并排序数组代码,我想做的就是用'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)

pax*_*blo 5

因为你得到的数组有一个奇怪的值和一个缺失值,最可能的情况是一个一个一个错误,可能是asize作为最后一个元素的索引传递而不是asize - 1.

合并排序所需的参数是第一个和最后一个索引(从零开始),因此,对于大小为10的数组,它将是09.你传递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)