我目前面临一个困难的排序问题。我有一组事件需要相互排序(比较排序)以及它们在列表中的相对位置。
用最简单的术语来说,我有一个事件列表,每个事件都有一个优先级(整数)、一个持续时间(秒)和事件可以出现在列表中的最早发生时间。我需要根据优先级对事件进行排序,但在其最早发生时间之前,列表中不能出现任何事件。这是一个(希望)使其更清晰的示例:
// Psuedo C# code
class Event { int priority; double duration; double earliestTime ; }
void Example()
{
Event a = new Event { priority = 1, duration = 4.0, earliestTime = 0.0 };
Event b = new Event { priority = 2, duration = 5.0, earliestTime = 6.0 };
Event c = new Event { priority = 3, duration = 3.0, earliestTime = 0.0 };
Event d = new Event { priority = 4, duration = 2.0, earliestTime = 0.0 };
// assume list starts at 0.0 seconds
List<Event> results = Sort( new List<Event> { a, b, c, d } );
assert( results[ 0 ] == a ); // 4.0 seconds elapsed
assert( results[ 1 ] == c ); // 7.0 seconds elapsed
assert( results[ 2 ] == b ); // 12.0 seconds elapsed
assert( results[ 3 ] == d ); // 14.0 seconds elapsed
}
项目“b”必须排在最后,因为它不允许在进入列表的 6.0 秒后开始,所以它被推迟并且“c”在“b”之前出现,即使它的优先级较低。(希望上面能解释我的问题,如果没有让我知道,我会编辑它。)
我目前的想法是使用插入排序来管理排序过程。与许多其他常见的排序算法不同,插入排序一次一个地决定列表的顺序。因此,对于每个索引,我应该能够找到满足其最早发生时间的下一个最低优先级事件。
我希望找到有关排序算法和数据结构的资源,以帮助我为这种“排序”问题设计一个好的解决方案。我真正的问题实际上比这更复杂:分层排序、事件之间的可变缓冲区、多个非常量时间限制,所以信息或想法越多越好。速度和空间并不是真正的问题。排序的准确性和代码的可维护性是一个问题。
编辑:澄清(基于评论)
- 事件消耗它们的整个持续时间(即不允许事件重叠)
- 事件必须在其最早时间或之后发生,它们不能在其最早时间之前发生。
- 如果存在较低优先级的事件,事件可能会晚于它们的 earlyTime
- 事件不能被打断
- 最长持续时间是可以放入列表中的所有事件的总和。这在上面没有显示。(实际上所有事件的持续时间将远远大于时间列表的最大持续时间。)
- 不能有任何空隙。(没有孔可以尝试回填。)
编辑:回答
虽然 David Nehme 给出了我选择的答案,但我想指出他的答案本质上是插入排序,其他几个人提供了插入排序类型的答案。这向我证实了专门的插入排序可能是要走的路。感谢大家的回答。