首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误的合并排序结果

错误的合并排序结果
EN

Stack Overflow用户
提问于 2012-01-04 05:43:22
回答 3查看 267关注 0票数 1

我写了一个常规的合并排序数组代码,我想做的就是用'asize‘调用这个函数,而不是用数字,而不是收到1 2 3 4 5 6 7 8 9 10一个常规的排序数组,我得到的是-858993460 1 2 3 4 5 6 7 8 9

请帮我找出原因

代码语言:javascript
复制
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]);
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-04 05:47:28

因为您的结果数组有一个奇怪的值和一个缺失值,所以最有可能的情况是off-by-one错误,很可能是将asize作为最后一个元素的索引传递,而不是asize - 1

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

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

代码语言:javascript
复制
{9, 7, 2, 3, 5, 4, 1, 8, 6, 10, ?}
 \___________________________/  |
          your array            +-- not your array

而且,因为?-858993460 (在本例中是-858993460),所以您最终得到:

代码语言:javascript
复制
{-858993460, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
 \___________________________________/  \/ not your
              your array                 \  array

然后,打印前十个元素就会得到您所看到的输出。不幸的是,无论是什么变量(或堆栈控制信息或其他任何东西)保存了这么大的负值,现在都被值10覆盖了,而不是您真正想要的东西。

你所做的是未定义的行为。马上停下来。别让我过来:-)

顺便说一句,简单的解决方法是改变:

代码语言:javascript
复制
merge_sort (a, 0, asize);

进入:

代码语言:javascript
复制
merge_sort (a, 0, asize - 1);
票数 5
EN

Stack Overflow用户

发布于 2012-01-04 05:46:20

您正在跨过数组的末尾进入垃圾。last应为asize-1,即调用merge_sort(a, 0, asize-1);

票数 2
EN

Stack Overflow用户

发布于 2012-01-04 05:46:44

代码语言:javascript
复制
merge_sort(a, 0, asize);

您应该发送asize-1,即从0asize-1 elements。下面就是正确的答案!

代码语言:javascript
复制
merge_sort(a, 0, asize-1);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8719019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档