#arrays #algorithm
#массивы #алгоритм
Вопрос:
У меня такая проблема:
я должен разработать алгоритм, который получает массив int и переставляет элементы, соответствующие этим ограничениям:
Для каждого элемента, должен быть ниже, чем его соседи или больше, чем его соседи:
for each x in array a,
( a[x-1]<=a[x] AND a[x 1]<=a[x] )
OR
( a[x-1]>=a[x] AND a[x 1]>=a[x] )
Все это в тете (n log n) в худшем случае
Я понятия не имею, как это сделать, моя единственная интуиция заключается в том, что я должен сделать что-то похожее на сортировку слиянием…
Извините за плохой английский
Комментарии:
1. Может быть, я нашел решение, я мог бы отсортировать массив, чем получать поочередно первый и последний элемент, я думаю, это хорошая идея…
Ответ №1:
-
Сортировка массива
-
Разрежьте его пополам
-
Поместите элементы из первой половины между элементами второй половины
-
Если количество элементов не равно, переместите последний элемент вперед
Пример:
-
2 3 1 5 7 8 6 4 9
-
1 2 3 4 5 6 7 8 9
-
1 5 2 6 3 7 4 8 9
-
9 1 5 2 6 3 7 4 8
Комментарии:
1. Также должен работать и будет проще, чем мой ответ; могут ли быть какие-то угловые случаи, однако?
2. Да, например, если количество элементов нечетное.
3. @piotrekg12 Вот что я тоже забыл — переместить последнюю группу вперед.
Ответ №2:
В качестве наивного подхода вы могли бы сначала выполнить некоторую сортировку и сгруппировать массив в группы одинакового размера. После этого смежные группы должны быть попарно переключены; если количество групп нечетное, первую группу необходимо переключить на обратную.
Пример:
Ввод: 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
(уже отсортирован)
Группы: (9 9) (8 8) (7 7) (6 6) (5 5) (4 4) (3 3) (2 2) (1 1)
Группы попарно переключаются: (8 8) (9 9) (6 6) (7 7) (4 4) (5 5) (2 2) (3 3) (1 1)
Первая группа переместилась в конец: (9 9) (6 6) (7 7) (4 4) (5 5) (2 2) (3 3) (1 1) (8 8)
Возможно, идею можно усовершенствовать, чтобы получить лучший алгоритм.
Комментарии:
1. Да, но что, если у меня есть не все пары? У меня мог бы быть массив, подобный этому: 2 3 1 5 7 8 6 4 9
2. Сортировка дает
9 8 7 6 5 4 3 2 1
, группировка дает(9) (8) (7) (6) (5) (4) (3) (2) (1)
, переключение дает(8) (9) (6) (7) (4) (5) (3) (2) (1)
.3. Переключение первого элемента на обратный приводит
(9) (6) (7) (4) (5) (3) (2) (1) (8)
.