0

Написать функцию:

void arrayReverse(int array[], int size)

4 ответа 4

5

Все уже описанное - для 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;
   }    
}
4

Классический способ - переставить в кортежах вида (1, n) элементы местами, например, с помощью std::swap. Т.е вам необходимо пробежаться по парам (1, n), (2, n - 1), ... и применить к ним этот самый std::swap.

Понятно, что в случае, если массив нечетного размера, то центральный элемент должен остаться на месте.

С кодом, я думаю, вы справитесь самостоятельно.

2

Есть разные варианты, например, с помощью рекурсии (не самый эффективный способ)

void arrayReverse(int *a, int l) {
    if (l > 1) {
        swap(&a[0], &a[l - 1]);
        arrayReverse(++a, l - 2);
    }
}

где функция swap меняет местами два значения в массиве.

6
  • Куда уж проще... swap(x, y) - это x на место y, а y на место x.
    – stanislav
    26 окт 2011 в 10:48
  • Если можно еще какой то метод посоветуйте.
    – arcs_host
    26 окт 2011 в 10:49
  • Интересно, конечно, но попробуйте таким способом зареверсить массив длиной 10e6, если предположить, что tail-рекурсия не соптимизится. 26 окт 2011 в 10:50
  • а без функции swap можно обойтись?
    – arcs_host
    26 окт 2011 в 10:51
  • 1
    @arcs_host В C нешаблонный swap для int можно написать как int t = a; a = b; b = t;. В C++ можно написать свой шаблонный swap или воспользоваться std::swap. 26 окт 2011 в 11:11
1

А если так?

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--;
     }
}
11
  • По рукам надо бить за xor'инг вместо свапа в продакшене. 26 окт 2011 в 14:40
  • @alexlz Оптимизировать, так до конца. register int *a = array; register int *b = array+size-1; while (a < b) { ... Далее, как у Вас. Или Ваш ответ это не попытка экономии 4-х байт в стеке ?
    – avp
    26 окт 2011 в 15:04
  • Давайте объявим конкурс на самое извращенное написание простейшей функции )))
    – skegg
    26 окт 2011 в 15:09
  • С условием a < b согласен, ну а с register компилятор сам разберётся. Ну задачи сверхоптимизации не ставил. @котик: а чем xor нехороши? Мне интересно стало.
    – alexlz
    26 окт 2011 в 15:09
  • 1
    @alexlz Ну в ответе на вопрос - это можно. Но если бы вы в проекте написали swap для целых чисел с помощью xor, который, очевидно, плохо читается, и не факт, что работает быстрее (зная современные компиляторы) - то перед нами случай premature optimization. -------- Стало непонятно, а пользы 0, т.к, чтобы сваппинг элементов стал hotspot'ом приложения, это еще надо постараться. 26 окт 2011 в 15:33

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками или задайте свой вопрос.