如何使用线性时间为这个特殊数组创建排序算法?

时间:2015-06-02 19:45:06

标签: c# algorithm

我有一个棘手的问题,我似乎无法弄明白。 我们有一个长度为n + m的数组。

数组由n个已排序的数字组成,然后是m个已排序的数字。例如:

2 5 8 11 15 17 19 3 4 9 10

然后n = 7且m = 4.

我需要在O(n)时间内完全对整个数组进行排序,而不是使用额外的数组/列表。

1 个答案:

答案 0 :(得分:0)

您需要执行合并排序的最后阶段,其中合并两个排序列表/数组。增加的复杂性是你想要O(1)内存使用。这可以按如下方式完成。

如果您有一个大小为n + m

的数组
  • 以数组i [0 .. n)和j [n .. n + m)
  • 开头
  • 如果第一个数组较低,请保留。
  • 如果第二个数组较低,则将其与第二个数组交换。
  • 现在第一个数组位于两个地方[n..j] [i..m]

简而言之,你有三个阵列

  • [0..i + j) - 已排序的部分。
  • [n..j] [i + j..n]第一个数组
  • [j..n + m]第二个数组。

当你进展i+j时,你会在一次传递中结束并拥有一个排序数组。