теоритическая задача: минимальное количество перестановок в массиве.

Fuz

Новичок
теоритическая задача: минимальное количество перестановок в массиве.

Есть массив из чисел, которых произвольное количество, к примеру
array (1,3,2,7,5).
Допустимая операция: перестановка любой пары элементов (не обязательно которые стоят подряд)
Необходимо посчитать минимальное кол-во перестановок, при которых массив становится отсортирован по возрастанию.
Задача известная и тривиальная должна быть, для тех кто в универе дружил с математикой) я - не дружил)
 

Fuz

Новичок
asm
сначала подумай, а потом пиши. мне не нужны методы сортировки, которые я и сам знаю уйму.
мне нужно посчитать кол-во перестановок и обосновать что оно является минимальным.
 

asm

Пофигист
Fuz
лабы решай сам или указывай сумму и в работу...
а если бы внимательн6о посмотрел то по ссылке есть и вычисление сложности.
 

phprus

Moderator
Команда форума
nalim
Где тут комбинаторика? Комбинаторика может сказать лиш сколько нам понадобиться сравнений для сортировки массива, а вот сколько перестановок для этого нужно в общем случае сказать нельзя. Можно только посчитать добавив подсчет в какой-либо алгоритм сортировки.
 

Vitafresh

Новичок
Fuz, какое-то странное условие.
Обычно в методах сортировки принято считать МАКСИМАЛЬНОЕ число перестановок, после которых массив будет гарантированно отсортирован...
 

dimagolov

Новичок
правильный ответ на вопрос в теме: 0 в случае получения сортированного массива на входе.

с другой стороны автор видимо имел в виду меру энтропии массива, он наверное хочет сравнивать массивы на "красоту".

ну что ж, реально для каждого массива есть подмножество тех элементов что уже стоят на местах - S и тех, что на местах не стоят - N. тогда минимальное кол-во перестановок (подразумевается что мы можем только менять местами пары элементов) будет |N|/2 - это если элементы перепутаны парами и |N|-1 при условии что ни одной пары не существует. Если задаться целью, то сравнивая сортированный массив с исходным можно весьма несложно получить искомую оценку.
 

partizan

Новичок
Для каждого элемента массива вычислим номер позиции, где он должен стоять в отсортированном массиве.

Далее составим ориентированный граф с вершинами 1..N, где из каждой вершины будет выходить ровно одно ребро:
Если k-й элемент массива должен стоять на j-м месте в отсортированном массиве - то из вершины k идет ребро в вершину j. (Если k-й елемент массива стоит на своем месте, то будет петля - из k в k).

Далее разбиваем полученный граф на компоненты связности. Пусть N1, N2, ...Ns - количество вершин в полученных компонентах связности.

Тогда ответ задачи: (N1-1)+(N2-1)+...+(Ns-1)

(Каждая компонента связности представляет собой "кольцо" из Ni елементов, чтоб их отсортировать надо Ni-1 перестановок.
Елементы, что стоят на своих местах дают каждый отдельную компонету связности с одним элементом.
Те, что не на своих местах - в лучшем случае "перепутаны парами" - тогда каждая компонента связности будет состоять из 2х вершин - N/2 перестановок. В худшем - все выстроятся в одно кольцо: N-1 перестановок).

Ну, как мог - объяснил.

-~{}~ 13.07.07 03:50:

Занятся нечем, нарисую пример для наглядности:
Исходный массив: ( 3, 5, 6, 4, 2, 1).

1-й элемент должен стоять на 3-м месте - из "1" ребро в "3". 3-й элемент - на 6-м месте - из "3" ребро в "6". 6-й элемент должен стоять на 1-м месте - из "6" ребро в "1". Вот 1-я компонента связности:
1 => 3 => 6 => 1

2-я:
2 => 5 => 2

3-я:
4 => 4

Перестановки: 1-й элемент меняем с 3-м, 3-й с шестым. 2-й с 5-м.

Из примера становится понятно, что весь хитроумный алгоритм с компонентами связности на самом деле - простая перестановка влоб: берем 1-й элемент, ставим на свое место. Если элемент, что стоял на его месте при этом попал на свое - хорошо, берем следующий, если нет - его ставим на свое место и т.д. И нет способа сделать это с меньшим числом перестановок.
 
Сверху