2015-10-31 2 views
2

Можно ли «застегнуть» массив без использования 2-х подмассивов? Обычно результат проносясь 2 массивов будет выглядеть примерно такzip массив без создания подмассивов

a1 = [1,2,3] 
a2 = [4,5,6] 
a3 = zip(a1, a2) 
a3 == [1,4,2,5,3,6] 

Однако, у меня нет 2 подмассива и все, что я даюсь это вход (позволяет сказать, что создание массивов не способность в данный момент) , и я хочу закрепить массив на месте. например

a1 = [1,2,3,4,5,6] 
zip(a1) 
a1 == [1,4,2,5,3,6] 

Мой текущий алгоритм не делает это правильно (это приводит к последовательности, где первая половина его сжатой правильно, но вторая половина промелькнула в обратном направлении)

array = [1,2,3,4,5,6,7,8] 
a = array[0] 
b = array[1] 
i = 0, j = array.length/2 
while (i + 2 < j) 
    array[i] = a 
    array[i + 1] = b 
    swap(array, i + 1, i + 2) 
    swap(array, i + 1, j) 
    i += 2, j += 1 
    a = b 
    b = array[i + 1] 

array == [1,5,2,6,4,8,3,7] 

Полных ответов Арен» t необходимо - руководство в общем направлении является предпочтительным.

ответ

1

Прямое путь, открывая пространство для каждого элемента на свопа, сдвигая вправо:

void swap(int *array, int left, int right) { 
    int tmp = array[right]; 
    while (right > left) 
      array[right] = array[--right]; 
    array[right] = tmp; 
} 

Теперь вы просто должны настроить ваш для индексов цикла:

void zip(int *array, int sz) { 
    int i, j; 
    for (i = 1, j = sz/2; j < sz; i += 2, ++j) 
      swap(array, i, j); 
} 
+0

отлично! Я бы предпочел не программировать решение, но это не работает. К сожалению, у меня нет ответа, чтобы поддержать свой ответ. – Antiokus

+0

Я бы хотел увидеть оптимизированное решение. :-) – jvdm