Given an array [a1b7c3d2]
convert to [abcd1732]
with O(1)
space and O(n)
time i.e. put the letters on the left and digits on the right such that their relative order is the same. I can think of an O(nlogn)
algorithm, but not better. Can somebody please help?
问问题
567 次
2 回答
3
AFAIK 它无法完成。这本质上是RADIX 排序算法的一个步骤。AFAIK 稳定的RADIX 排序不能就地完成。
编辑Wikipedia 同意我的观点(因为这是值得的):
http://en.wikipedia.org/wiki/Radix_sort#Stable_MSD_radix_sort_implementations
MSD 基数排序可以实现为一种稳定的算法,但需要使用与输入数组大小相同的内存缓冲区
编辑2
如果输入总是成对的字母数字,那么解决方案很简单,因为我们总是知道哪个字符应该放在哪里:
for i=0...n/2-1
tmp=array[i]
if tmp is a letter
continue // nothing to do, we have a letter already!
index=i
do
// we have the wrong think at index! Where is it supposed to be?
if (index is even) // the wrong thing is a letter
index=index/2
else // the wrong thing is a number
index=n/2+index/2
// we found where temp should go! Lets put it there!
// But we keep what was already there and look for its place next iteration
tmp2=array[index]
array[index]=tmp
tmp=tmp2
while index!=i
它可能看起来是二次的,就像i
我们做的每一个一样while
,但实际上每个元素只移动一次,因此它是线性的。
于 2013-09-28T21:51:25.703 回答
1
首先,这确实是这个 SO question的副本,只是表述方式有所不同。
(因为你的问题真的可以被认为是稳定的 0-1 排序)
不幸的是,我无法弄清楚算法,也找不到任何简单的伪代码,但如果你想在这里描述算法:http ://www.diku.dk/~jyrki/Paper/KP1992bJ.pdf
于 2013-09-28T21:31:04.157 回答