C 当我使用线程实现合并排序时,得到错误的输出,可以';我想不出是什么';这是不对的

C 当我使用线程实现合并排序时,得到错误的输出,可以';我想不出是什么';这是不对的,c,multithreading,pthreads,posix,C,Multithreading,Pthreads,Posix,我解决这个问题已经有3天了,我已经梳理了我的全部代码,试图找出为什么我得到了不正确的输出。这个程序的目的是使用线程进行合并排序。第一部分简单地将元素并行排序为用户输入的多个段。测试的唯一输入为2、5和10。而要排序的数组将始终是随机生成的50整数数组。当输入的段(由main顶部的变量“segments”表示)为2时,我的代码工作正常。但是,当我将segments更改为5或10时,我不会在末尾得到排序数组。我尝试过使用print语句进行调试(我已经注释掉了,但您仍然可以看到),在前两次合并迭代中似

我解决这个问题已经有3天了,我已经梳理了我的全部代码,试图找出为什么我得到了不正确的输出。这个程序的目的是使用线程进行合并排序。第一部分简单地将元素并行排序为用户输入的多个段。测试的唯一输入为2、5和10。而要排序的数组将始终是随机生成的50整数数组。当输入的段(由main顶部的变量“segments”表示)为2时,我的代码工作正常。但是,当我将segments更改为5或10时,我不会在末尾得到排序数组。我尝试过使用print语句进行调试(我已经注释掉了,但您仍然可以看到),在前两次合并迭代中似乎出现了问题。由于某些原因,这些合并迭代的结果不符合顺序,并且它们包含在传递给它的原始数组中不存在的重复数字。当我只是将数组传递给排序方法和合并方法时,我的排序方法和合并方法可以很好地工作,并且不使用线程,但是当我使用线程时,我得到了无法解释的行为。下面是我的整个程序,要合并50个数组,应执行以下操作:

  • 将数组拆分为10段(共5段),并对每个段进行排序
  • 两人一组,一轮一轮地传递线段。因此,第一轮应该在一个段中使用pas段0-5,在另一个段中使用pas段5-10,10-15和15-20,20-25和25-30,依此类推,直到达到40-45和45-50
  • 然后它将进入第二轮,第二轮的动作与第一轮相同,但它会以10对的方式通过各个部分。所以0-10和10-20,20-30和30-40,然后10的最后一部分保持不变
  • 第三轮通过分段以20:0-20和20-40成对合并,然后停止
  • 最后,它应该将0-40段与40-50段合并
我的程序:(你应该主要关注我的主函数,排序很好,合并看起来也很好,但我已经包括了它们以防万一)


很抱歉,这是一堵长长的文字墙,我已经试着自己解决了这个问题,但在无数的头发拉扯后,我无法理解它。请帮我找出我做错了什么。我想我的问题在于我加入线程的方式,或者我的合并功能,但因为我不能确定,我只是把整个事情都包括进去了。

花了一段时间,但我终于做到了:)

这一行的问题在于:

    int *partition2 = numbers + (i+1 * (size));
这相当于(由于运算符优先级)

这不是你想要的

应该是:

    int *partition2 = numbers + ((i+1) * (size));

请注意附加的括号。如果没有它,
partition2
索引计算不正确。因此,合并数组的不同部分。

这并不能解释您所问的问题,但请注意,比较函数对于极值是错误的。例如,如果
*a
为负,
*b
INT\u MAX
.oh。我的。上帝哇!哇。你不知道我花了多少时间梳理我的整个代码,并为这个明显的错误一遍遍地重写一切。我应该知道得更清楚,这让我非常谦卑,哈哈。谢谢!看到我看不到的东西就到此为止。你也可以避免大部分括号,只需写
int*partition2=numbers+(I+1)*size
    int *partition2 = numbers + (i+1 * (size));
int *partition2 = numbers + (i + size);
    int *partition2 = numbers + ((i+1) * (size));