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

Sorting a linked list in parallel using Insertion Sort

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

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

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

使用合并排序和多线程怎么样?
数组的每个分区都会创建一个新线程,最后同步线程输出。因此,对于深度 n,将有 <(2^n+1) 个线程。
因此,您正在对链表进行并行排序,并且也不存在资源处理不当的情况。

抱歉,repo 不够,无法写在评论中。

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

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

关于线程数量,我建议固定数量不大于核心数量。在这里,快速排序又更容易了。例如,如果您有 4 个线程,那么您使用第一个线程来执行第一个分区。然后,您使用两个线程进行 4 个分区。使用这 4 个分区,您可以将每个分区分配给每个线程。当4个线程都加入到调用线程中时,数组就会被排序。

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

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 文章中所述,指针通常替换为基地址的偏移量。我不确定使用 next "offset" 与 next "pointer" 的链表是否适用于此作业。

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