Algorithm 分开字母和数字,使它们在O(n)时间和O(1)空间中的相对顺序保持相同

Algorithm 分开字母和数字,使它们在O(n)时间和O(1)空间中的相对顺序保持相同,algorithm,sorting,time-complexity,in-place,Algorithm,Sorting,Time Complexity,In Place,给定一个数组[a1b7c3d2]转换为[abcd1732],使用O(1)空格和O(n)时间,即将字母放在左边,数字放在右边,使它们的相对顺序相同。我可以想到一种O(nlogn)算法,但不是更好。有人能帮忙吗?首先,这真的是重复的,只是说得有点不同 (因为您的问题实际上可以被视为稳定的0-1排序) 不幸的是,我无法找出算法,也找不到任何简单的伪代码,但如果您想在这里描述算法:好吧,这是不可能的。这本质上是基数排序算法的一个步骤。而且一个稳定的基数排序不能在适当的位置完成 编辑维基百科同意我的观点(

给定一个数组
[a1b7c3d2]
转换为
[abcd1732]
,使用
O(1)
空格和
O(n)
时间,即将字母放在左边,数字放在右边,使它们的相对顺序相同。我可以想到一种
O(nlogn)
算法,但不是更好。有人能帮忙吗?

首先,这真的是重复的,只是说得有点不同

(因为您的问题实际上可以被视为稳定的0-1排序)


不幸的是,我无法找出算法,也找不到任何简单的伪代码,但如果您想在这里描述算法:

好吧,这是不可能的。这本质上是基数排序算法的一个步骤。而且一个稳定的基数排序不能在适当的位置完成

编辑维基百科同意我的观点(不管它值多少钱):

MSD基数排序可以作为稳定的算法实现,但需要 使用与输入数组大小相同的内存缓冲区

Edit2

如果输入总是成对的字母数字,那么解决方案非常简单,因为我们总是知道哪个字符应该放在哪里:

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
,我们在
时执行
,但实际上每个元素只移动一次,因此它是线性的。

你能详细说明一下你的nlogn算法吗?数组总是这样成对的格式吗?如果是这样的话,这个算法是微不足道的。。。因此,我怀疑情况可能并非如此。此外,我们能指望字母和数字的数量相等吗?给定描述
返回[abcd1732]
将是一个有效的算法,因为输入保证是
[a1b7c3d2]
。我打赌这与O(1)空格和O(n)无关时间。虽然这在理论上可以回答这个问题,但在这里包括答案的基本部分,并提供链接供参考,如果只是因为我们不是所有人都有PDF阅读器的话。@JanDvorak,因为链接断了,我们真的不想阅读一个6页的文档来找到答案。@Dukeling是的。。。我不想重述那篇文章中已经存在的内容。我不会说我什么都懂,但他们确实“欺骗”。“作弊”是指他们使用
log(n)
计数器(使内存
O(log n)
但是他们对这些计数器进行位打包(它们足够小),所以他们只使用
O(1)
计数器(每个计数器都有
log(n)
位)。您可以将此作为评论发布。我的错,对不起!没有重新加载其他答案上的评论。@us2012好吧,您更改了您的评论:)Ehm-基数排序逐位(或逐位)排序。每个步骤使用一个位(数字)进行排序。这里的位是“这是一个字母还是一个数字”,你能把基数排序的一个步骤简化为这个问题吗(不仅仅是使用基数排序)?如果不是,这个答案其实意义不大(它只是意味着这种解决方法不能满足要求)。“算法有很多特例。”杜克林肯定。用最高位设置为“数字”调用每个值,用最高位清除的“字母”调用每个值。@JanDvorak但这不是仅仅用基数排序来实现的吗?这正是我所说的,证明不了多少-
“不是简单地用基数排序来实现的”