Java 在线性时间和恒定空间中交替排列两个排序序列的数组排序
这是我今天在一次采访中被问到的,在盯着这个问题看了5分钟后被踢了出去 给定一个数组A,使得所有奇数位置的子序列([A1,A3,A5,…])和所有偶数位置的子序列([A2,A4,A6,…])都是按排序顺序排列的,例如[1,7,2,8,3,9,4,10,5]或[3,8,4,11,5]或[5,2,7,4]-在O(n)时间和O(1)空间(包括堆栈空间和输出数组空间)中排序A 在过去的两个小时里,我绞尽脑汁,挑我朋友的毛病。谷歌没有给出任何答案。我不想给任何意见涂上颜色,但我觉得在给定的复杂情况下,这可能不可能解决 我们如何解决这个问题?如果(1)两个交织序列在取消交织时可以形成一个单调序列,并且(a)数组以最小数开始且长度为奇数,或者(b)数组以第二个序列的最小数开始(取消交织时将位于右侧的序列)如果是等长的,我们可能可以反转中描述的算法 我们必须先执行“循环先导”序列,然后执行循环移位 例1Java 在线性时间和恒定空间中交替排列两个排序序列的数组排序,java,algorithm,sorting,data-structures,Java,Algorithm,Sorting,Data Structures,这是我今天在一次采访中被问到的,在盯着这个问题看了5分钟后被踢了出去 给定一个数组A,使得所有奇数位置的子序列([A1,A3,A5,…])和所有偶数位置的子序列([A2,A4,A6,…])都是按排序顺序排列的,例如[1,7,2,8,3,9,4,10,5]或[3,8,4,11,5]或[5,2,7,4]-在O(n)时间和O(1)空间(包括堆栈空间和输出数组空间)中排序A 在过去的两个小时里,我绞尽脑汁,挑我朋友的毛病。谷歌没有给出任何答案。我不想给任何意见涂上颜色,但我觉得在给定的复杂情况下,这可能
[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(简单):
我不希望任何人在没有被允许调查的情况下在面试中提出这个问题:)你确定这不是一个骗人的问题吗?我认为你能做的最好的就是O(n logn)。在一个算法MOOC中有一次向我解释过它,尽管我记不起它背后的推理。O(n logn)是你能达到的最小值。找到它后,基于比较的排序不能比O(n logn)快:O(1)吗假设就地排序?是否可以跳过一些比较,因为我们知道备用元素已排序?如果这个问题不是O(1)空间,这是一个简单的排序合并。现在的问题是,这在恒定空间中是否可能@管理层收购(MBo)并没有得到确切的澄清。额外的空间不应该取决于阵列的大小。这看起来很酷,但我似乎没有想到。伪代码可能吗?@AntarikshaYelkawar抱歉,我刚刚注意到你的评论。我是说,似乎编写代码有点复杂。文章中的算法或我的建议是否有助于您更好地理解?
[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