Написать функцию:
void arrayReverse(int array[], int size)
Все уже описанное - для C++, для чистого С писать функцию ручками, типа этой:
void arrayReverse(int array[], int size) {
int i, temp;
for (i = 0, size--; i < size; i++, size--) {
temp = array [i];
array[i] = array [size];
array[size] = temp;
}
}
Классический способ - переставить в кортежах вида (1, n)
элементы местами, например, с помощью std::swap
. Т.е вам необходимо пробежаться по парам (1, n)
, (2, n - 1)
, ... и применить к ним этот самый std::swap
.
Понятно, что в случае, если массив нечетного размера, то центральный элемент должен остаться на месте.
С кодом, я думаю, вы справитесь самостоятельно.
Есть разные варианты, например, с помощью рекурсии (не самый эффективный способ)
void arrayReverse(int *a, int l) {
if (l > 1) {
swap(&a[0], &a[l - 1]);
arrayReverse(++a, l - 2);
}
}
где функция swap меняет местами два значения в массиве.
10e6
, если предположить, что tail-рекурсия
не соптимизится.
26 окт 2011 в 10:50
C
нешаблонный swap
для int
можно написать как int t = a; a = b; b = t;
. В C++
можно написать свой шаблонный swap
или воспользоваться std::swap
.
26 окт 2011 в 11:11
А если так?
void arrayReverse(int array[], int size) {
int *a, *b, i;
for(a = array, b = array+size-1, i=0; i < size/2; i++) {
*a ^= *b;
*b ^= *a;
*a++ ^= *b--;
}
}
a < b
согласен, ну а с register
компилятор сам разберётся. Ну задачи сверхоптимизации не ставил. @котик: а чем xor нехороши? Мне интересно стало.
swap
для целых чисел с помощью xor
, который, очевидно, плохо читается, и не факт, что работает быстрее (зная современные компиляторы) - то перед нами случай premature optimization
. -------- Стало непонятно, а пользы 0, т.к, чтобы сваппинг элементов стал hotspot'ом
приложения, это еще надо постараться.
26 окт 2011 в 15:33