【问题标题】:Inserting a number into a sorted array!将数字插入排序数组!
【发布时间】:2010-06-07 12:09:59
【问题描述】:

我想编写一段代码,用于将数字插入到已排序数组中的适当位置(即插入后数组仍应保持排序状态)

我的数据结构不允许重复。

我打算做这样的事情:

  1. 使用二分搜索找到我应该放置此元素的正确索引
  2. 为此元素创建空间,方法是将该索引中的所有元素向下移动。
  3. 把这个元素放在那里。

还有其他更好的方法吗?

【问题讨论】:

  • 你知道什么是自平衡二叉树吗?
  • 如果您想使用普通数组,除了您描述的解决方案之外,我看不到其他解决方案。
  • 问题是我被限制使用连续内存。我不明白我怎么能用树做到这一点。有办法吗?
  • 您始终可以将二叉树表示为数组,就像@tafa 所说的那样——尽管如果树不完全平衡(即,如果右分支比左分支更深,则效率不是 100%)姐姐,你的数组中会有空槽)。

标签: c data-structures


【解决方案1】:

如果你真的有一个数组而不是更好的数据结构,那是最佳选择。如果您对实施很灵活,请查看AA Trees - 它们相当快速且易于实施。显然,它比数组占用更多空间,如果元素数量不足以注意到 blit 与指针魔法相比的缓慢性,则不值得。

【讨论】:

    【解决方案2】:

    数据是否必须一直完全排序? 如果不是,如果只需要快速访问最小或最高元素,Binary Heap 给出恒定的访问时间和 logn 的添加和删除时间。 更重要的是,它可以满足您的条件,即内存应该是连续的,因为您可以在数组顶部实现 BinaryHeap(即,array[2n+1] 左孩子,array[2n+2] 右孩子)。

    【讨论】:

      【解决方案3】:

      如果您要插入大量元素,则基于堆的树实现会更有效 - log n 用于定位/删除和插入操作。

      【讨论】: