寻找最佳的就地排序算法

时间:2014-06-24 14:08:06

标签: sorting in-place

我正在研究航空电子设备操作系统(线程层),并且我正在寻找关于以下(简化)要求的最佳解决方案: "等待[各种对象]的线程按优先级顺序排队。对于相同的优先级,线程也按FIFO顺序排队"。

[各种物体]例如是信号量。

我认为我可以使用经典链表构建这样的等待列表,这使得插入/排序相对快速和简单,并且完全符合预期用法(一个线程一次进入等待状态)。但是我正在研究一个裸机目标而且我没有任何libc支持,因此我没有malloc(这对于链表非常有用!)。

为了按优先级排序线程,我通常使用二进制堆(http://en.wikipedia.org/wiki/Binary_heap)这是非常有效的,但它不能在这里使用,因为" FIFO顺序"不能以这种方式管理。

当然,我可以使用更经典的排序算法来实现,但它们通常很耗时,即使是一次插入也是如此,因为每次插入时都会移动很多数组元素。

所以我想知道是否存在一个合适的算法...可能是一种改进的二进制堆?...或者一个“静态”链表?...或者最好的事情是与链表相关的分配器算法?...

有关信息:   - 线程总数限制为128,因此内存需求总是有限的,可以在编译时知道/保留。   - 我有一个有限的数量或RAM,所以我几乎不能建立这样的二进制堆排序优先级指向FIFO(自然按到达时间排序)......

我真的很感激这个问题的任何想法和新面貌。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可能需要稳定的就地排序 - 按优先级排序后,它将保持项目的相对顺序,满足您的FIFO要求。

从wiki中的列表中选择任何内容,例如就地合并排序,块排序和时间排序都是就地且稳定的: http://en.wikipedia.org/wiki/Sorting_algorithm

关于内存分配和链接列表 - 也许你可以实现自己的malloc? 您可以分配固定大小的堆(128 *线程信息大小),然后使用每个块的索引 作为指针。所以对象的真实指针将是(堆起始地址)+索引*(块大小)。 然后像往常一样实现排序,但使用索引而不是指针。

另一个想法是将FIFO要求与优先级队列要求分开,并使用具有相同优先级项的队列对容器进行排序 - 但这需要动态列表分配和更大的堆。

答案 1 :(得分:0)

此问题的标准技术是Bentley-Saxe优先级队列。我将在这里详细描述它,以及如何以最小的内存要求就地实现它的一些技巧,但我所说的任何内容都只是重申Pat Morin对CS Theory StackExchange的优秀答案:Pat Morin's answer to "Is there a stable heap?" on cstheory.SE < / p>