§ 14. Преобразование элементов массива

14.3. Обмен местами элементов в массиве

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

buf := a[i];

a[i] := a[k];

a[k] := buf;

Для обмена элементов можно использовать встроенную функцию swap: swap(a[i], a[k]).

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

Этапы выполнения задания

I. Исходные данные: одномерный массив а, количество элементов n.

II. Результат: преобразованный массив a.

III. Алгоритм решения задачи.

1. Ввод исходных данных. 
2. Найдем максимальный элемент массива и его индекс (n_max)
3. Найдем минимальный элемент массива и его индекс (n_min)
4. Поменяем местами элементы, стоящие на местах n_max и n_min
5. Вывод результата.

IV. Описание переменных: n, n_min, n_max – int, а – vector <int>.

Пример 14.3. Задан одномерный массив целых чисел. Циклически сдвинуть все элементы массива влево на 1, первый на последнее место. Например, массив 1 2 3 4 5 будет преобразован в 2 3 4 5 1.

Этапы выполнения задания

I. Исходные данные: одномерный массив а, количество элементов n.

II. Результат: преобразованный массив a.

III. Алгоритм решения задачи.Описание переменных: n – int, а – vector <int>.

1. Ввод исходных данных. 
2. В цикле осуществим обмен соседних элементов.
3. Вывод результата.

Решением задачи 14.3 может быть также следующий алгоритм (пример 14.4):

1. Сохраним значение первого элемента в буферной переменной. 
2. В цикле сдвинем все элементы на 1 влево. 
3. Запишем значение буфера на последнее место в массиве.

Если в массив добавить еще один элемент в конце, то его можно использовать в качестве буферной переменной. В этом случае в цикле нужно будет сделать на 1 сдвиг больше. Затем удалить последний элемент. Удалить последний элемент можно с помощью команды pop_back().

Фрагменты программ в примере 14.5 показывают, как можно циклически сдвинуть элементы массива на 1 вправо (последний на первое место).

Осуществим обмен элементов  следующим образом:

a[i] = a[k]; a[k] = a[i];

Тогда мы потеряем значение элемента, стоящего изначально на месте a[i], и получим два элемента со значением, равным a[k].

Пример 14.2.

 V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "n = ";

  cin >> n;

  vector <int> a(n);

  for (int i = 0; i < n; i++)

    cin >> a[i];

  //поиск минимального элемента

  int n_min = 0;

  for (int i = 1; i < n; i++)

    if (a[i] < a[n_min])

      n_min=i;

  //поиск максимального элемента

  int n_max = 0;

  for (int i = 1; i < n; i++)

    if (a[i] > a[n_max])

      n_max=i;

  swap (a[n_min], a[n_max]);

  for (int i = 0; i < n; i++)

    cout << a[i] << " ";

  cout << endl;

  return 0;

}

VI. Тестирование.

Пример 14.3.

V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "n = ";

  cin >> n;

  vector <int> a(n);

  for (int i = 0; i < n; i++)

    cin >> a[i];

  for (int i = 0; i < n - 1; i++)

    swap (a[i], a[+ 1]);

  for (int i = 0; i < n; i++)

    cout << a[i] << " ";

  cout << endl;

  return 0;

}

VI. Тестирование.

Пример 14.4.

V. Программа:

#include <iostream>

#include <vector>

 

using namespace std;

 

int main()

{

  int n;

  cout << "n = ";

  cin >> n;

  vector <int> a(n);

  for (int i = 0; i < n; i++)

    cin >> a[i];

  a.push_back(a[0]);

  //сдвиг влево

  for (int i = 0; i < n; i++)

    a[i] = a[+ 1];

  a.pop_back();

  for (int i = 0; i < n; i++)

    cout << a[i] << " ";

  cout << endl;

  return 0;

}

Пример 14.5. Циклический сдвиг вправо на 1. Фрагменты программ:

for (int i = n - 1; i > 0; i--)

  swap (a[i], a[- 1]);

  

a.push_back(a.back());

  //сдвиг вправо

for (int i = n - 1; i > 0; i--)

  a[i] = a[- 1];

a.front() = a.back();

a.pop_back();