使用插入排序对链表进行并行排序

Posted

技术标签:

【中文标题】使用插入排序对链表进行并行排序【英文标题】:Sorting a linked list in parallel using Insertion Sort 【发布时间】:2015-10-24 11:33:06 【问题描述】:

我有一个任务,我必须编写一个 C 程序,该程序根据多个进程中的震级对地震链表进行排序。对于作业的第一部分,我们的老师只允许我们使用多个进程而不是线程。

到目前为止,我能够在一个过程中对地震列表进行排序,但我不确定如何拆分链接列表并在不同的过程中对每个部分进行排序。我一直在研究使用共享内存,但我不确定如何正确使用它。

有没有更好的方法来解决这个问题?如果没有,如何使用共享内存使用插入排序对地震列表进行排序?

【问题讨论】:

【参考方案1】:

如何使用归并排序和多线程? 数组的每个分割都会创建一个新线程,最后同步线程输出。因此,对于深度 n,将有 因此,您正在对链表进行并行排序,并且也不存在资源处理不当的情况。

抱歉,repo 不够写评论。

【讨论】:

我没有提到这一点,但是对于分配的第一部分我们必须使用多个进程,然后对于下一部分我们将使用多个线程进行排序,对两种方法进行计时并比较时间用于对列表进行排序。 赋值是使用插入排序。【参考方案2】:

共享内存中链表的一个问题是让所有进程拥有相同的共享内存虚拟地址:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366763(v=vs.85).aspx

http://man7.org/linux/man-pages/man7/shm_overview.7.html

http://linux.die.net/man/2/mmap

我不知道你使用的是 Linux 还是 Windows。

如果共享内存的基地址不同,那么如 msdn 文章中所述,指针通常被替换为基地址的偏移量。我不确定使用下一个“偏移量”与下一个“指针”的链表是否适用于此分配。

另外,作业提到使用插入排序,所以插入排序或插入排序的变体用于合并由进程创建的排序列表,或者您是否允许使用合并列表函数来合并列表?

【讨论】:

该作业仅适用于基于 Unix 的系统,我们可以使用合并列表功能来合并列表。 节点应该被发送到其他进程。 @mwharrisjr - 那么节点应该如何在进程之间发送,比如管道或其他东西? 我的老师说我们可以使用管道、文件、共享内存或消息队列。 @mwharrisjr - 需要某种同步,因此消息队列可以工作,每个进程都有一个用于接收来自主进程的节点的队列,并在发送排序时将队列与每个进程分开节点返回主进程。节点中的下一个指针可用作标志,非空表示将发送更多节点,空可用于虚拟节点,表示前一个节点是最后一个节点,进程更改为它的下一个状态(比如从排序到返回节点)。这不会有效率,但我认为效率不是这里的目标。【参考方案3】:

我会说快速排序比合并排序更容易并行化。原因是您只需执行分区的顺序传递(使用合并排序,您将需要两个,分区和合并)。一旦对数组(或列表)进行了分区,序列就会被分成两个独立的部分;他们永远不需要额外的处理,因为枢轴已经在它的最终位置。

但是,如果选择了错误的主元,快速排序可能会降低 en O(n^2)。小心点

关于线程数,我推荐一个不大于核心数的固定数。在这里,快速排序再次变得更容易。例如,如果您有 4 个线程,则使用第一个线程进行第一个分区。然后,您使用两个线程进行 4 个分区。使用这 4 个分区,您可以将每个分区分配给每个线程。当 4 个线程加入调用线程时,数组将被排序。

【讨论】:

以上是关于使用插入排序对链表进行并行排序的主要内容,如果未能解决你的问题,请参考以下文章

279,对链表进行插入排序

147. 对链表进行插入排序

147. [链表]对链表进行插入排序

对链表进行插入排序

LeetCode--147.对链表进行插入排序

LeetCode第147题—对链表进行插入排序—Python实现