小编典典

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

algorithm

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


阅读 234

收藏
2020-07-28

共1个答案

小编典典

AFAIK无法完成。这实际上是 RADIX排序 算法的一个步骤。而且AFAIK稳定的 RADIX排序 无法就地完成。

编辑 Wikipedia同意我的观点(价值):

http://en.wikipedia.org/wiki/Radix_sort#Stable_MSD_radix_sort_implementations

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

编辑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,但是实际上每个元素只移动了一次,因此是线性的。

2020-07-28