不带指针的双向定向圆阵算法

时间:2013-09-08 20:00:39

标签: c arrays algorithm circular-buffer

我有26个英文字母字符数组。说:

char a[26] = ['a','b','c','d'.......so on till ....'z']

我需要以圆形方式移动数组中的元素(可以是顺时针或逆时针)。

据我所知,存在一种称为圆形阵列的数据结构,但它是单向的。

说,我想将数组中的每个元素前移3个元素,然后按新数组移动:

char new[26] = ['x','y','z','a','b'... and so on till 'w']

但是,我可能还想通过说2个元素向后移动元素,然后我的新数组应该是:

char new[26]=['c','d','e'....and so on... 'y','z','a','b']

所有这一切都应该在不使用指针的情况下完成(因为我还没有读过指针)。

有没有办法实现这个?

我已经搜索了很多关于圆形阵列但我从未意识到如何将简单的数组用作圆形数组并且向前和向后移动元素。有人能告诉我是否有方法可以做到这一点?

数组大小是固定的。

我们用C编码

2 个答案:

答案 0 :(得分:0)

您只需在数组index上使用模数:

size_t index;
size_t move_index(int pos_or_neg_steps) {
    return (index + pos_or_neg_steps) % 26;
}

答案 1 :(得分:0)

天真地使用 O(1) 额外记忆并且 O(n^2) 时间

C代码(天真):

void shiftElements(int *array, int size, int shift) {
  int i,reverse;

  reverse = shift < 0;
  if(shift < 0)
    shift = -shift;
  if(shift > size) 
    shift %= size;

  for(i=0; i < shift; ++i) {
    if(reverse)
      shiftForward(array,size);
    else
      shiftBackwards(array,size);
  }
}

void shiftForward(int *array, int size) {
  int tmp = array[size-1];
  int i;
  for(i=size; i>0; --i)
    array[i] = array[i-1]; 
  array[0] = tmp;
}

void shiftBackward(int *array, int size) {
  int tmp = array[0];
  int i;
  for(i=0; i<size; ++i)
    array[i] = array[i+1]; 
  array[size-1] = tmp;
}

有效地使用 O(N) 额外内存并且 O(N) 时间

C代码(高效):

void shiftElements(int *array, int size, int shift) {
  int i,reverse,absVal,*tmp;

  reverse = shift < 0;
  absVal  = shift < 0 ? -shift : shift;
  if(shift > size) 
    shift %= size;
  *tmp = malloc(shift * sizeof *array);

  for(i=0; i < absVal; ++i)
    tmp[i] = array[size-shift+i];

  for(i=0; i < size; ++i)
    array[(i+shift)%size] = array[i];

  for(i=0; i < absVal; ++i)
    array[size+shift+i] = tmp[i];
  free(tmp);
} // I still need to test some corner cases, but you should get the idea