Как сделать реверс массива c

Обновлено: 07.07.2024

Репутация: нет
Всего: нет

Доброго времени суток!
Есть обычный массив, нужно сделать реверс значений, т.е. первому элементу присвоить последний, второму предпоследний и тд.
Нужен алгоритм, но не функция.
Что- то было такое в сортировках если память не изменяет!
Заранее спасибо.

Репутация: 1
Всего: 1

имеем два указателя один на начало второй на конец,
цикл, от 0 до размер массива деленный на два, указатель на начало увеличивается на единицу, указатель на конец уменьшается на единицу
тело цикла, обмен значений, на которые ссылаются указатели

мне кажется этот алгоритм ты мог бы придумать сам..

Репутация: 2
Всего: 2

а использование итераторов rbegin и rend не устраивает?

хехе.. что-то я под масивом сразу понял вектор..

Репутация: нет
Всего: нет

Репутация: 1
Всего: 1

так нельзя делать, обмена же не происходит.. вводи дополнительную переменную..

Репутация: 2
Всего: 2

Репутация: нет
Всего: нет

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

fish9370, спасибо что напомнил. Попробуем.

ПС Лана малому сказку пошел читать завтра попробую.

Репутация: 2
Всего: 50

Код

template
void reverse (BidirectionalIterator first, BidirectionalIterator last)
while ((first!=last)&&(first!=--last)) std::iter_swap (first,last);
++first;
>
>

Репутация: нет
Всего: нет

Репутация: нет
Всего: 3

мой "топорный" вариант. Делал как задание из книги K&R

Код

/* функция reverse: переписывает строки в обратном порядке. Суть работы в следующем:
т.к. мы знаем, что любая строка заканчивается символом '\0', можно на время удалить
из строки данный символ и занять его место первым элементом массива. После этого можно
осуществить последовательный перенос всех элементов. В последствии необходимо будет
"сдвинуть" полученную строку влево */
void reverse(char s[])
int n, i, c, j;

Репутация: нет
Всего: нет

Репутация: 1
Всего: 1

Код

void mirror(char *str) char *end;
for(end = (char *)str + strlen(str) - 1; end >= str;) char c = *str;
*str++ = *end;
*end-- = c;
>
>

Репутация: нет
Всего: нет

С чего ты взял что ему нужно именно char*?

Код

void reverse(char* array)
int number= strlen(array);
char* begin = &array[0];
char* end = &array[number-2];
for (int i=0; i

Репутация: 1
Всего: 1

а ты с чего взял, что эта строка меняет две ячейки местами?

Репутация: нет
Всего: нет

С intом все работает Ой, не работвет

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

[ Время генерации скрипта: 0.1523 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Почему место for (int i = 0; i я не могу просто передать копию _arr = arr ?

Ответы (3 шт):

почему нельзя просто написать int _arr[len];

В языке С++ размеры в объявлениях массивов должны быть Целочисленными Константными Выражениями, т.е. попросту выражаясь целыми константами времени компиляции. В вашем случае len не является константой времени компиляции. Это означает, что объявить массив int _arr[len] вы не сможете. Создать массив размера len в С++ можно только через динамическое выделение памяти, либо явно (напр. через new[] ), либо неявно (напр. через std::vector ).

Однако задача реверса массива запросто решается in-place, без заведения дополнительного массива-копии. Поэтому метод создания дополнительного массива к данной теме не должен иметь никакого отношения вообще.

Так можно делать без копии массива:

Есть стандартный алгоритм std::reverse (как учит нас Sean Parent, желательно по-максимуму пользоваться стандартными алгоритмами вместо циклов). Кроме того, в C++11 добавлены std::begin и std::end , которые понимают, кроме прочего, и массивы с их размерами. В таком случае ваш пример можно реализовать таким образом:

должно привести к

Я получил это как интервью.

ОТВЕТЫ

Ответ 1

Вместо слова // some code here в вопросе стоит заменить следующий код:

Вы должны выполнять итерацию только через первую половину массива ( arr.Length / 2 ). Если вы выполните итерацию по всему массиву ( arr.Length ), он будет дважды изменен, что даст тот же порядок элементов, что и до его начала.

Ответ 2

В принципе, вас попросят переопределить Array.Reverse(Array) . Если вы посмотрите, как реализован в самой структуре и игнорирует многие технические детали, вы обнаружите, что он просто вызывает трехпараметрическую версию (который меняет указанную часть массива) на весь массив.

Array.Reverse(Array,Int32,Int32) - это цикл while, который свопирует элементы и поддерживает два индекса:

  • i указывает на первый элемент обращенной части и
  • j указывает на последний элемент обращенной части.

Переписано вместо // some code here вместо вопроса :

Это легче понять, чем реализация с использованием for-loop, делает меньше арифметических и элегантно уклоняется от gotcha с двойной реверсией.

Ответ 3

Ответ 4

Ну, очевидно, вы можете просто скопировать в новый массив в обратном порядке.

Чтобы выполнить операцию "на месте", вы можете работать с обоих концов по направлению к середине: загрузите первый и последний элементы, затем сохраните их, первый в последнее место и последний в первое место. Затем выполните второй и следующий-последний и т.д. Если у вас есть четное число элементов, вы выполняете N/2 итерации. Если вы выполняете нечетное число (N-1)/2 итерации и оставляете средний элемент там, где он был.

Возможно, существуют и другие алгоритмы, которые будут немного быстрее при рассмотрении размера строки кеша и других характеристик памяти, но они не стоили бы этого, если бы вы не были в действительно критичной для производительности ситуации.

Ответ 5

Вы можете сделать это разными способами: от самого быстрого до самого глупого:

Но я не могу понять, почему вы преследуете такой бесполезный квест, если это что-то произвело на кого-то кого-то, а затем использовать вместо циклов for:)

Ответ 6

Ответ 7

Ответ 8

То есть цикл So Simple Start из Array legth и так далее, смотрите код, и вы поймете :)))

Ответ 9

попробуйте что-то вроде:

Я не тестировал это, но он должен быть на правильном пути. Любая причина, по которой вы не хотите использовать Array.Reverse? Вероятно, это хорошо оптимизированная версия алгоритма.

Ответ 10

Лучше использовать метод Array.Reverse

Вы можете прочитать больше описания Здесь

Ответ 11

//без использования метода обратного и без использования дополнительного массива // Попробуйте выполнить оператор, начиная с последнего элемента

Ответ 12

Я не очень хорош в петлях. Но это то, что мне кажется простым -

Ответ 13

Это динамическое решение для обращения к массиву любого типа данных. Некоторые из ключевых моментов в моем алгоритме - это сначала вычислить половину длины массива и добавить проверку, чтобы остановить итерацию, когда индексы массива имеют одинаковое значение. Этап, имеющий те же индексы, показывает, что он Снова запустите обратную операцию. На этом этапе прервите внешний цикл, используя " Оператор goto ".

Метод reverse изменяет порядок элементов в массиве на обратный.

Метод изменяет исходный массив (он станет перевернутым) и возвращает также перевернутый массив (можно пользоваться и так, и так).

Синтаксис

Пример

Давайте перевернем массив:

Результат выполнения кода:

Пример

А теперь давайте запишем перевернутый массив в новую переменную:

Результат выполнения кода:

Пример . Применение

Давайте перевернем символы строки в обратном порядке. Для этого разобьем строку в массив с помощью split по разделителю '' (этот разделитель положит каждый символ строки в отдельный элемент массива), перевернем этот массив с помощью reverse и затем сольем перевернутый массив обратно с помощью join :

Читайте также: