优化算法排列数组,其中偶数索引的项位于数组的左侧,具有奇数索引的项目位于数组的右侧

时间:2015-12-01 09:40:11

标签: arrays algorithm sorting recursion

要求:使用递归,数组的大小是偶数。

例如:

0 ... 1 ... 2 ... 3 ... 4 ... 5(指数顺序)

a ... b ... c ... d ... e ... f(排列前的数组)

a ... c ... e ... b ... d ... f(安排后的数组)

0 ...... 1 ...... 2 ...... 3 ...... 4 ...... 5 ...... 6 .... ..7(指数顺序)

a1 .... b1 .... a2 .... b2 .... a3 .... b3 .... a4 .... b4(排列前排列)

a1 .... a2 .... a3 .... a4 .... b1 .... b2 .... b3 .... b4(排列后的数组)

如果我们不关心优化,问题看起来容易解决,我们可以使用临时数组或使用递归结合循环来移动项目...我认为这种方式不是最好的解决方案....我试着用递归与交换操作相结合,不使用循环...但我失败了。

希望有人建议我解决问题的想法,谢谢你的帮助

2 个答案:

答案 0 :(得分:0)

首先,让我提一下,最佳解决方案取决于数组的大小(占用了多少元素),假设在内存中这意味着数组大小受到限制,您可以通过快速循环获得复杂性O(n)就像这样。令数组为N,N中的元素数为x。

  • 获取所有奇数元素的起始索引= x / 2(如果x为偶数)或 (x + 1)/ 2
  • 让该索引为
  • 让偶数元素从b开始。设b = 0
  • 创建名为T
  • 的输出数组
  • while start = 0但小于x,INCR和BEGIN
  • 如果start是偶数,则将元素N(start)放入T(b ++)
  • 如果start是奇数,则将元素N(start)放入T(a ++)

接受数组插入和查找O(1)。

操作

  1. 确定当前索引,您无法避免检查数组中的每个索引。
  2. 您无法避免生成输出,但删除元素,检索值并将其置于正确位置的计算成本更高。更容易插入内存中已分配的空间。
  3. 你可以选择运行并发for循环,这样可以加快速度,但我认为这超出了你想要的范围。

答案 1 :(得分:0)

不要认为最佳解决方案是递归,但如果它是问题描述的一部分,并且如果我保证数组的大小是2的幂,那么我将应用分而治之

简单的情况是问题的大小是2.问题已经解决了。解决了2个大小为2的分区后,必须将它们组合在一个大小为4的分区中。例如

0 ...... 1 ...... 2 ...... 3 ...... 4 ...... 5 ...... 6 .... ..7(指数顺序)

a1 .... b1 .... a2 .... b2 .... a3 .... b3 .... a4 .... b4(排列前排列)

a1 .... a2 .... b1 .... b2 .... a3 .... a4 .... b3 .... b4(组合大小为2的分区后的数组)

完成组合大小为2的分区后,组合大小为4的分区。

a1 .... a2 .... a3 .... a4 .... b1 .... b2 .... b3 .... b4(组合大小为2的分区后的数组)

组合2个大小为N的分区,意味着交换左侧分区右侧的N / 2项,右侧分区左侧有N / 2项。这可以通过一个简单的循环来完成。

希望这些想法可以帮助你完成任务。