Вопрос задан 14.02.2026 в 07:55. Предмет Информатика. Спрашивает Гергель Дмитрий.

Массив содержит четное количество элементов. Напишите программу, которая сортирует первую половину массива по возрастанию, а вторую – по убыванию. Каждый элемент должен остаться в «своей» половине. Пример: Массив: 5 3 4 2 1 6 3 2 После сортировки: 2 3 4 5 6 3 2 1

Перейти к ответам

Ответы на вопрос

Отвечает Колосов Дмитрий.

Нужно отсортировать две половины массива независимо друг от друга, при этом элементы не должны переходить из первой половины во вторую и наоборот:

  • первая половина (индексы 0 ... n/2 - 1) — сортировка по возрастанию;

  • вторая половина (индексы n/2 ... n-1) — сортировка по убыванию.

Так как элементов чётное количество, граница половин всегда ровно посередине: mid = n/2.


Алгоритм

  1. Считываем n и массив a из n чисел.

  2. Находим середину: mid = n/2.

  3. Сортируем первую половину:

    • либо отдельно копируем a[0:mid], сортируем по возрастанию, возвращаем на место,

    • либо сортируем “на месте” любым алгоритмом (пузырёк/вставки/быстрая) только в диапазоне 0..mid-1.

  4. Сортируем вторую половину:

    • аналогично, но по убыванию, в диапазоне mid..n-1.

  5. Выводим массив.


Пример

Массив:
5 3 4 2 1 6 3 2
n = 8, mid = 4

  • Первая половина: 5 3 4 2 → сортировка по возрастанию → 2 3 4 5

  • Вторая половина: 1 6 3 2 → сортировка по убыванию → 6 3 2 1

Результат:
2 3 4 5 6 3 2 1


Готовое решение (Python)

python
n = int(input()) a = list(map(int, input().split())) mid = n // 2

a[:mid] = sorted(a[:mid]) # первая половина по возрастанию a[mid:] = sorted(a[mid:], reverse=True) # вторая половина по убыванию

print(*a)


Готовое решение (C++)

cpp
#include using namespace std;

int main() { ios::sync_with_stdio(false); cin.tie(nullptr);

int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i];

int mid = n / 2;

sort(a.begin(), a.begin() + mid); // первая половина по возрастанию sort(a.begin() + mid, a.end(), greater<int>()); // вторая половина по убыванию

for (int i = 0; i < n; i++) { if (i) cout << ' '; cout << a[i]; } return 0; }


Почему это правильно

  • mid = n/2 делит массив на две равные части.

  • Сортировка выполняется в пределах каждой части, поэтому элементы не могут “перепрыгнуть” границу.

  • В первой части порядок становится неубывающим, во второй — невозрастающим, как требуется по условию.

Похожие вопросы

Топ вопросов за вчера в категории Информатика

Последние заданные вопросы в категории Информатика

Задать вопрос