算法保持变化数组的排序顺序

时间:2012-12-05 16:40:59

标签: algorithm sorting

我有20项数组,其中包含十进制数字。他们没有分类。在每次迭代时,只有几个数组的项目发生变化(约有1-3项20项数组)。在每次迭代之后,我需要具有相同的数组,但是“已排序”。

我不应该修改原始数组,而是需要维护“并行”结构,它代表相同的数组,但是已经排序。允许使用指针。

我确实关心延迟,所以我需要直截了当的解决方案!显然我可以使用双链表来“记住”排序顺序,但我会花K * O(n)(用相当大的K)来更新这个列表,听起来有点贵。我正在寻找更好的双链表。

我会在c#上实现这个问题

2 个答案:

答案 0 :(得分:3)

假设您跟踪1-3个已更改的元素,可以非常高效地完成使用合并排序的单步,并在数组上进行额外迭代

  1. 按顺序将所有元素收集到两个数组changednotChanged 1 中。
  2. 排序changed(对于1-3个元素,它应该相当容易和快速)。
  3. 使用merge(changed,notChanged)获取已排序的数组
  4. 我认为复杂度为O(n)具有相当好的常数,因为merge()在一次迭代中完成,收集阶段也是如此。此外,由于我们仍在使用数组,因此这种方法应该具有很高的缓存效率。


    (1)请注意notChanged已排序,因为未更改的元素在它们之间进行排序!

答案 1 :(得分:0)

只需使用两种结构:这是非常简单,强大的,因为您使用现有的良好工作收集,并且实施成本便宜:

使用两个集合:

一个未排序:例如在java ArrayList中,这是一个动态增长阵列 一个分类:使用你想要的任何东西 像往常一样,两个“集合”都指向内容对象。

在多线程的情况下使线程安全:

将两个集合封装在一个类中,您可以在其中同步所有访问, 这样,两个馆藏的阅读和写作都会同步。