排序算法,交替相等的项目

时间:2013-02-13 22:02:14

标签: algorithm sorting

这种排序情况的好(简单)算法/方法是什么:

我有一个项目数组,其中每个项目包含2个字段:(ID,Timestamp)

有许多具有相同ID的项目。

我想对数组进行排序,使得项目尽可能在ID之间交替,从具有最早时间戳的项目开始。

例如,使用此输入:

(1,15:00)
(1,15:05)
(1,15:10)
(2,15:15)
(2,15:20)
(2,15:25)
(3,15:30)
(4,15:35)
(3,15:40)

我会得到这个输出:

(1,15:00)
(2,15:15)
(3,15:30)
(4,15:35)
(1,15:05)
(2,15:20)
(3,15:40)
(1,15:10)
(2,15:25)

我主要是在寻找一种概念上简单的算法,当然,如果它具有高性能,那就太好了。

现在我能想到的最好的是:

  1. 初始化/创建临时数组T
  2. 从数组A:获取具有最早时间戳的项目X,其中ID不在T
  3. 将X添加到结果集R,将X.ID添加到T,将弹出X添加到A
  4. 只要X存在,重复步骤2-3,否则在步骤1重新开始
  5. A为空时退出

1 个答案:

答案 0 :(得分:2)

  1. 将所有项目放在按ID排序的排序多图中,然后按时间排序。 (例如,您可以使用由ID键控的喜爱的已排序关联容器来实现此功能,其中已排序容器中的每个值本身是另一个包含所有时间值的已排序容器。
  2. 虽然此多重映射中仍有任何元素:对于每个按升序排列的键,请使用该键删除第一个元素并将其添加到结果中。
  3. 完成后,如果我已正确理解问题,结果将按您想要的顺序排列。

    以下是Java中的示例,使用Guava TreeMultimap s(未经测试):

    TreeMultimap<Id, Timestamp> map = new TreeMultimap<Id, Timestamp>();
    for (/* ... every item ... */) {
      map.put(item.getId(), item.getTimestamp());
    }
    
    List<Entry> outputList = new ArrayList<Entry>();
    while (!map.isEmpty()) {
      for (Id key : map.keySet()) {
        Timestamp value = map.get(key).first();
        outputList.add(new Entry(key, value));
        map.remove(key, value);
      }
    }
    return outputList;