在线性时间和恒定空间中以交替位置对具有两个排序序列的数组进行排序

时间:2019-04-27 08:27:51

标签: java algorithm sorting data-structures

这是今天在一次采访中问我的,被盯着问题5分钟后被踢了出去。

  

给出一个数组 A ,使得所有奇数位置([ A 1 A 3 A 5 ,…])和所有偶数位置的子序列([ A 2 A 4 A 6 ,…])均按排序顺序排列-例如[1、7、2、8、3、9、4、10、5]或[3、8、4、11、5]或[5、2、7、4] —对 A 在O( n )时间和O(1)空间(包括堆栈空间和输出数组空间)中。

最近两个小时,我绞尽脑汁,挑了我朋友的脑袋。 Google没有给出任何答案。我不想涂上任何意见,但我觉得在给定的复杂性下这可能无法解决。

我们该如何解决?感谢所有输入。

1 个答案:

答案 0 :(得分:1)

如果(1)两个交错的序列在非交错时可以形成一个单调序列,则(a)数组以最低编号开始并且长度为奇数,或者(b)数组以第二个序列的最小序号(不交织时将在右侧的序列)开始,并且长度相等,我们也许可以逆转A Simple In-Place Algorithm for In-Shuffle (Peiyush Jain, 2008)中描述的算法。

我们必须首先执行“循环前导”序列,然后执行循环移位。

示例1

[1, 7, 2, 8, 3, 9, 4, 10, 5]
 1  2  3  4  5  6  7   8  9
 1  6  2  7  3  8  4   9  5

|1| unaffected

   |1     3                |
   m = 4; 2m = 3^2 - 1
   cycles start on 3^0, 3^1
   (4 swaps with 7 and the other
    numbers form a longer cycle.)

示例2(简单):

[1, 5, 2, 7, 3]
 1  2  3  4  5
 1  4  2  5  3

|1| unaffected

   |          |
   m = 1
   cycle in 2m => 2, 5
   cycle in 2m => 3, 7
   cycle shift by m between 5 and 3
   => 2, 3, 5, 7

我不会期望任何人在不被允许进行研究的情况下接受采访时提出的,但:)