Перейти к содержимому

Как перевернуть массив в c

  • автор:

Как перевернуть массив в c

Регистрация: 30.05.2018

Сообщений: 56

Реверс массива с помощью указателей (Си)

Здравствуйте! Подскажите, пожалуйста, что я делаю неправильно при разыменовании указателя *current?
Задача состоит в том, чтобы с помощью передачи в функцию указателя на первый элемент и на следующий элемент после массива перевернуть массив.

void array_reverse_ptr(int* array, int* limit) < for (int* current = array; current < limit; current++)< int storage_prt = *current; *current = *(limit - current - 1); *(limit - current - 1) = storage_prt; >> int main() < int myarray[] = ; int myarray_size = 6; array_reverse_ptr(myarray, myarray + 6); printf("\n"); for (int i = 0; i < myarray_size; i++)< printf("%d ", myarray[i]); >>

Как перевернуть массив в c

В С++ не шарю, поэтому возник вопрос. Можно ли как-нибудь быстро перевернуть массив (поменять его элементы зеркально). Я использую следующий код:

inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) < BYTE buf; for(int i = 0, j = numBytes - 1; i < numBytes; i++) < j -= i; buf = data[j]; data[j] = data[i]; data[i] = buf; >return; >

Re: Зеркалировать массив

От: Анатолий Широков
Дата: 19.08.04 11:29
Оценка: 6 (2) +2

std::reverse(data, data + numBytes);

Re: Зеркалировать массив

От: BArt
Дата: 19.08.04 11:40
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>В С++ не шарю, поэтому возник вопрос. Можно ли как-нибудь быстро перевернуть массив (поменять его элементы зеркально). Я использую следующий код:

А>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А> < А>BYTE buf; А> for(int i = 0, j = numBytes - 1; i < numBytes; i++) А> < А>j -= i; А> buf = data[j]; А> data[j] = data[i]; А> data[i] = buf; А> > А> return; А>>

и работало?
j -= i; //.
может
j = numBytes — 1 — i; //?

Re: Зеркалировать массив

От: poilk
Дата: 19.08.04 11:41
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>В С++ не шарю, поэтому возник вопрос. Можно ли как-нибудь быстро перевернуть массив (поменять его элементы зеркально). Я использую следующий код:

А>

А>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А> < А>BYTE buf; А> for(int i = 0, j = numBytes - 1; i < numBytes; i++) А> < А>j -= i; А> buf = data[j]; А> data[j] = data[i]; А> data[i] = buf; А> > А> return; А>>

Штой-то примерчик не заработал.
Попробуй так:

for(int i = 0; i < (numBytes+1)/2; i++)

Re[2]: Зеркалировать массив

От: Аноним
Дата: 19.08.04 11:50
Оценка:

Здравствуйте, BArt, Вы писали:

BA>Здравствуйте, , Вы писали:

А>>В С++ не шарю, поэтому возник вопрос. Можно ли как-нибудь быстро перевернуть массив (поменять его элементы зеркально). Я использую следующий код:

А>>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А>>< А>> BYTE buf; А>> for(int i = 0, j = numBytes - 1; i < numBytes; i++) А>> < А>> j -= i; А>> buf = data[j]; А>> data[j] = data[i]; А>> data[i] = buf; А>> > А>> return; А>>>

BA>и работало?
BA>j -= i; //.
BA>может
BA>j = numBytes — 1 — i; //?
Да ошибся, j = numBytes — 1 — i; Сэнкс

Re: Зеркалировать массив

От: andrij
Дата: 19.08.04 11:50
Оценка:

Здравствуйте, Аноним, Вы писали:

А>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А> < А>BYTE buf; for(int i = 0, j = numBytes - 1; i < numBytes / 2; // далее чем за середину итерировать нет смысла .  ++i, --j/*надо так :) */) А> //for(int i = 0, j = numBytes - 1; i < numBytes; ++i)А> < А>// j -= i; - ето не коректно А> buf = data[j]; А> data[j] = data[i]; А> data[i] = buf; А> > А> return; А>>

make it simple as possible, but not simpler
Re[2]: Зеркалировать массив

От: Аноним
Дата: 19.08.04 11:55
Оценка:

Здравствуйте, andrij, Вы писали:

A>Здравствуйте, Аноним, Вы писали:

A>

А>>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А>>< А>> BYTE buf; A> for(int i = 0, j = numBytes - 1; A> i < numBytes / 2; // далее чем за середину итерировать нет смысла .  A> ++i, --j/*надо так :) */) А>> //for(int i = 0, j = numBytes - 1; i < numBytes; ++i)А>> < А>> // j -= i; - ето не коректно А>> buf = data[j]; А>> data[j] = data[i]; А>> data[i] = buf; А>> > А>> return; А>>>

А что быстрее std::Reverse или собственная функция?
Re[3]: Зеркалировать массив

От: sergey_shandar http://getboost.codeplex.com/
Дата: 19.08.04 11:57
Оценка: 1 (1) +1

Здравствуйте, Аноним, Вы писали:

А>А что быстрее std::Reverse или собственная функция?
Premature optimization is the root of all evil in programming. — Tony Hoare

Re[3]: Зеркалировать массив

От: BArt
Дата: 19.08.04 12:03
Оценка:

Здравствуйте, <Аноним>, Вы писали:

А>Здравствуйте, andrij, Вы писали:

A>>Здравствуйте, Аноним, Вы писали:

A>>

А>>>inline void Command::ReverseAllArrayBytes(BYTE* data, int numBytes) А>>>< А>>> BYTE buf; A>> for(int i = 0, j = numBytes - 1; A>> i < numBytes / 2; // далее чем за середину итерировать нет смысла .  A>> ++i, --j/*надо так :) */) А>>> //for(int i = 0, j = numBytes - 1; i < numBytes; ++i)А>>> < А>>> // j -= i; - ето не коректно А>>> buf = data[j]; А>>> data[j] = data[i]; А>>> data[i] = buf; А>>> > А>>> return; А>>>>

А>А что быстрее std::Reverse или собственная функция?

в любом случае быстрее вставка на асм-е

Re[3]: Зеркалировать массив

От: andrij
Дата: 19.08.04 12:23
Оценка:

Здравствуйте, Аноним, Вы писали:

А>А что быстрее std::Reverse или собственная функция?

Если посмотреть на реализацию — то ето почти одно и тоже,
(std::reverse даже быстрей), и если ето не особо трудно
то лутше перейти на STL

make it simple as possible, but not simpler
Re[4]: Зеркалировать массив

От: Twirl
Дата: 19.08.04 12:26
Оценка: +1

Здравствуйте, andrij, Вы писали:

A>Здравствуйте, Аноним, Вы писали:

А>>А что быстрее std::Reverse или собственная функция?

A>Если посмотреть на реализацию — то ето почти одно и тоже,
A>(std::reverse даже быстрей), и если ето не особо трудно
A>то лутше перейти на STL

не надо забывать что std::reverse универсален. поэтому имхо надо использовать его. если будет не устраивать скорость (в чем я сомневаюсь), тогда уже шаманить с ручным перевертыванием или с asm.

Re: Зеркалировать массив

От: Chez
Дата: 19.08.04 12:34
Оценка:
templateclass T> inline void Reverse(T* p, size_t nCount) < T temp; while (nCount > 1) < temp = p[0]; p[0] = p[--nCount]; p++[nCount--] = temp; >>

Chez, ICQ# 161095094
Re[2]: Зеркалировать массив

От: Sir Wiz
Дата: 19.08.04 12:47
Оценка:

Здравствуйте, Анатолий Широков, Вы писали:

АШ>#include
АШ>std::reverse(data, data + numBytes);

Так ведь байты и станут считать. Семантически лучше так:

std::reverse(data, data + numElements);

Re: Зеркалировать массив

От: Аноним
Дата: 19.08.04 13:27
Оценка:

Здравствуйте, Аноним, Вы писали:

А>В С++ не шарю, поэтому возник вопрос. Можно ли как-нибудь быстро перевернуть массив (поменять его элементы зеркально). Я использую следующий код:

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

void reverse_bytes(BYTE* data,int count) < BYTE* pb = data; BYTE* pe = data + count - 1; while( pb < pe ) < *pb ^= *pe; *pe ^= *pb; *pb ^= *pe; pb++;pe--; >>

самый красивый вариант: написать свой класс, переопределить для него оператор []

T operator [] (int idx) < if( revers ) return data[count - idx - 1]; else return data[idx]; > void reverse()

Re[3]: Зеркалировать массив

От: Анатолий Широков
Дата: 19.08.04 13:40
Оценка: +1

Здравствуйте, Sir Wiz, Вы писали:

SW>Здравствуйте, Анатолий Широков, Вы писали:

АШ>>#include
АШ>>std::reverse(data, data + numBytes);

SW>Так ведь байты и станут считать. Семантически лучше так:

Я взял переменные автора из оригинального поста

Re[2]: Зеркалировать массив

От: sergey_shandar http://getboost.codeplex.com/
Дата: 19.08.04 13:41
Оценка: +1

Здравствуйте, Аноним, Вы писали:

А>самый красивый вариант: написать свой класс, переопределить для него оператор []

А>

А>T operator [] (int idx) А> < А>if( revers ) А> return data[count - idx - 1]; А> else А> return data[idx]; А>> А>void reverse() А> < А>revers = !revers; А>> А>

Тогда уж лучше с STL, если лень "зеркалировать":

#include . typedef std::reverse_iterator ReverseIterator; ReverseIterator Begin = ReverseIterator(data + numBytes); ReverseIterator End = ReverseIterator(data);

Re[4]: Зеркалировать массив

От: WolfHound
Дата: 19.08.04 14:07
Оценка:

Здравствуйте, BArt, Вы писали:

BA>в любом случае быстрее вставка на асм-е
Практика показывает что интеловский компилятор быстрее.

Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: Зеркалировать массив

От: BArt
Дата: 19.08.04 14:35
Оценка:

Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, BArt, Вы писали:

BA>>в любом случае быстрее вставка на асм-е
WH>Практика показывает что интеловский компилятор быстрее.

что, его код совершенно не поддается оптимизации?

Re[6]: Зеркалировать массив

От: WolfHound
Дата: 19.08.04 15:44
Оценка:

Здравствуйте, BArt, Вы писали:

BA>что, его код совершенно не поддается оптимизации?
В большинстве случаев нет. А во всех остальных нужен монстр ассемблерщик (например я не могу состязаться с современными оптимизирующим компиляторами) и прирост будет не значительный.
Короче не выгодно. Лучше потратить это время на оптимизацию алгоритма выигрыш будет больше.
И еще учти что иногда появляются новые процессоры. с новими коммандами. и придется тебе все ассемблерные вставки переписывать, а я просто пересоберу программу.

Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Зеркалировать массив

От: Шахтер
Дата: 19.08.04 16:40
Оценка: -1

Здравствуйте, sergey_shandar, Вы писали:

_>Здравствуйте, Аноним, Вы писали:

А>>А что быстрее std::Reverse или собственная функция?
_>Premature optimization is the root of all evil in programming. — Tony Hoare

Это что, мантра лентяя-программиста, ищущего оправдание, чтобы не думать об эффективности?

26.08.04 01:48: Оставлено модератором в 'C/C++' — Павел Кузнецов
В XXI век с CCore.

Копай Нео, копай -- летать научишься. © Matrix. Парадоксы

Как перевернуть массив в java

Для переворота массива можно воспользоваться методом ArrayUtils.reverse() :

Для этого нам необходимо подключить библиотеку Apache в файле build.gradle.

dependencies  implementation 'org.apache.commons:commons-lang3:3.12.0' > 
import org.apache.commons.lang3.ArrayUtils; public class App  public static void main(String[] args)  int[] arr = 1,2,3,4,5>; ArrayUtils.reverse(arr); System.out.println(ArrayUtils.toString(arr)); // => > > 

Перевернуть массив

Хотел перевернуть массив, сам не смог написать написать алгоритм, путем гугла нашел это: for (int i = 0; i < array.length / 2; i++) < int tmp = array[i]; array[i] = array[array.length - i - 1]; array[array.length - i - 1] = tmp; >Может кто объяснить, как это работает с массивом, который array.length() = 5, например?

Комментарии (12)

  • популярные
  • новые
  • старые

Для того, чтобы оставить комментарий Вы должны авторизоваться
Уровень 36
11 июня 2021, 11:14

Для себя подведу итог ) Напишу для себя своими словами. Находим делением на 2 "срединую точку массива+1". При использовании символа "
Уровень 39
2 декабря 2020, 15:37

Массив перевернуть можно: 1) Можно создать отдельно метод. Пример: sort(array) - сам назвал так 2) В нем прописать: а) Сортировка массива от меньшего к большему через класс Arrays с методом sort б) Делаем цикл for (int i=array.length -1; i>0; i--) - от последнего числа (внешний) в) Делаем еще цикл for(int j=0; j

29 сентября 2020, 13:25

Самый простой вариант создать новый массив и наполнить числами старого с конца int[] marks2 = new int[marks.length]; for (int i = marks.length-1; i > 0;) < for (int j = 0; j < marks.length; j++) < marks2[j] = marks[i]; i--; >>

Уровень 35
6 мая 2020, 14:15

если вдруг кто наткнется на этот пост, я прочитал и ничего не понял. проще здесь http://proglang.su/java-examples/strings-reverse

25 декабря 2021, 13:57
Так это только выводит массив в обратном порядке. Сами числа остаются на своих местах.
Уровень 22
23 сентября 2019, 17:52

А мне вот хотелось бы подробных разъяснений, так как я вообще ни во что не въезжаю. Как меняются элементы в такой структуре, что значит array[array.length - i - 1]? Чтобы было понятней, можно использовать вместо i цифры, пожалуйста? серьезно понять не могу как это берет элемент с конца и переставляет в начало, начало ещё вижу откуда берется

Уровень 22
23 сентября 2019, 18:04

-1 делается потому, что изначально счётчик поставлен на 0? типо, есть 5 элементов в массиве: аrray <1, 2, 3, 4, 5>(но считается length по индексам, типо 0,1,2,3,4?) первая переменная при первой итерации цикла (i = 0) берет себе array[0](то есть аrray[1] - точно или нет??), а вторая array[array.length - i - 1] берет себе array[5 - 0 - 1] (потому что был ноль в счетчике?) и по итогу это тоже самое, что и array[4] (наш конечный элемент) и так далее пока не доберемся до средины, которая всегда неизменна? маякните мне пожалуйста, что не так, а что так

CilitBang QA в КЕФИР!
24 сентября 2019, 07:41

Проще всего тебе взять массив, например <4, 1, 3, 2>, взять листочек и ручку, и прогнать массив через этот цикл. Это будет лучше всех объяснений. По факту: 1. -1 потому что для нашего массива <4, 1, 3, 2>length равен 4, в то время как последний индекс 3, а работаем мы именно с элементами. 2. При первой итерации мы кладем в tmp элемент array[0], т.е. в tmp лежит 4. Потом мы меняем местами элементы, говорим, что array[0] теперь array[array.length - i - 1], т.е. array[0] = array[4 -0 - 1], итого array[0] = 2, последнему элементу, а array[array.length - i - 1] = tmp, куда, как мы помним, положили array[0]. После этого прохода массив выглядит так . 3. Потом еще один проход и меняются по такой же схеме средние элементы, с индексом 1 и 2, и получается .

Уровень 22
24 сентября 2019, 15:56

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

Уровень 41
17 сентября 2019, 07:53 решение

Сначала первый и последний элементы меняются местами, затем второй и предпоследний и т.д. Если размер массива - нечетное число, то средний элемент менять не надо, поэтому индекс до не него и не дойдёт.

CilitBang QA в КЕФИР!
17 сентября 2019, 07:59

Всерн не до конца понимаю. Почему i < array.length / 2? Получается ведь что он вообще не дойдет до конца массива. Как я вижу: например, если array.length() = 4, то цикл будет работать, пока i < 2. Т.е. он поменяет пару элементов туда сюда и все.

CilitBang QA в КЕФИР!
17 сентября 2019, 08:02
Все, разобрался. Спасибо. Проблема еще дополнительно в том, что я неправильно прочитал цикл.

  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
  • Задачи-игры

Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *