Реверс массива

Задача

Переставить элементы заданного массива в обратном порядке, то есть произвести реверс массива.

Пояснение к задаче и алгоритм решения

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

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

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

Таким образом, реверс массива происходит в цикле, количество итераций (проходов) которого равно не более половины от количества элементов. В теле цикла происходит обмен элементов. Если индексация (i) массива начинается с единицы, а количество элементов N, то индекс элемента, с которым должен происходить обмен будет находиться по формуле N-i+1. Если же индексация идет с нуля, то противоположный для i элемент находится как N-i-1.

Исходный код на языке программирования Pascal

const N = 10;
var
    a: array[1..N] of integer;
    i: byte;
    b: integer;
begin
    for i:=1 to N do
        read(a[i]);
 
    for i:=1 to N div 2 do begin
        b := a[i];
        a[i] := a[N-i+1];
        a[N-i+1] := b;
    end;
 
    for i:=1 to N do
        write(a[i],' ');
 
    writeln;
end.

Пример(ы) выполнения программы на языке Pascal

1 2 3 4 5 6 7 8 9 -1
-1 9 8 7 6 5 4 3 2 1

Исходный код на языке программирования C

#include <stdio.h>
#define N 9
main() {
    int a[N], i, b;
    for (i=0; i<N; i++) scanf("%d",&a[i]);
    for (i=0; i<N/2; i++) {
        b = a[i];
        a[i] = a[N-i-1];
        a[N-i-1] = b;
    }
    for (i=0; i<N; i++) printf("%d ",a[i]);
    printf("\n");
}

Пример(ы) выполнения программы на языке C

1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1

Исходный код на языке программирования Python

a = input()
a = a.split()
a = [int(i) for i in a]
for i in range(len(a)//2):
    b = a[i]
    a[i] = a[len(a)-i-1]
    a[len(a)-i-1] = b
#a.reverse()
#a = a[::-1]
print(a)

Пример(ы) выполнения программы на языке Python

1 2 3 4 5
[5, 4, 3, 2, 1]

Особенности решения на языке программирования Python

В Python есть метод, позволяющий сделать реверс списка reverse().
Также можно перевернуть список с помощью операций взятия среза. Срез a[::-1] берет все элементы из списка, начиная с конца.

В коде ниже второй и третий способ указаны как комментарии.

Исходный код на языке программирования Basic

N = 10
dim a(N)
for i=0 to N-1
        input a[i]
next i
for i=0 to N\2
        b = a[i]
        a[i] = a[N-i-1]
        a[N-i-1] = b
next i
for i=0 to N-1
        print a[i]+" ";
next i
print

Пример(ы) выполнения программы на языке Basic

11
101
33
22
15
64
3423
26
7
456
456 7 26 3423 15 64 22 33 101 11

Тема

Массивы

Уровень сложности

Средний

Дата публикации

Комментарий