Как перевернуть массив в 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] (наш конечный элемент) и так далее пока не доберемся до средины, которая всегда неизменна? маякните мне пожалуйста, что не так, а что так1,>
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, и получается .4,>
Уровень 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‑девелопера.