错误的合并排序结果

时间:2012-01-03 21:43:22

标签: 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]);

3 个答案:

答案 0 :(得分:5)

因为你的结果数组有一个奇怪的值和一个缺失值,最可能的情况是一个一个一个错误,可能是asize作为最后一个元素的索引而不是{{1 }}

合并排序所需的参数是第一个和最后一个索引(从零开始),因此,对于大小为10的数组,可以是asize - 10。您正在使用当前代码传递90

因此,您实际上正在对“数组”进行排序:

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);