Суть решения этой проблемы заключается в следующем наблюдении
1. Элементы в массиве не повторять
2. Диапазон элементов от 0 до n-1, где n - размер массива.
Способ подхода
После того, как вы поняли способ приблизиться к проблеме, можно решить ее в линейном времени.
Представьте себе, как выглядит массив после сортировки всех записей?
Это будет выглядеть как arr [i] == i, для всех записей. Это убедительно?
Сначала создайте BOOL массив с именем FIX, где FIX [я] == TRUE, если Ith местоположение фиксировано, инициализировать этот массив с фальшивой первоначально
начать проверку исходного массива для обр матча [я] == i, до тех пор, пока это условие не будет выполнено, все в порядке. При продолжении обхода массива также обновляем FIX [i] = true.
В тот момент, когда вы обнаружите, что arr [i]! = I
вам нужно что-то сделать, arr [i] должно иметь некоторое значение x такое, что x> i, как мы это гарантируем? Гарантия исходит из того, что элементы в массиве не повторяются, поэтому, если массив сортируется до индекса i, это означает, что элемент в позиции i в массиве не может поступать слева, а справа.
Теперь значение x по существу говорит о некотором индексе, почему так, потому что массив имеет только элементы до n-1, начиная с 0, и в отсортированном arry каждый элемент i массива должен находиться в местоположении i.
Что такое arr [i] == x означает, что не только элемент i не находится в правильном положении, но и элемент x отсутствует на своем месте. Теперь, чтобы исправить это местоположение, вам нужно взглянуть на x-е место, потому что, возможно, xth место занимает i, а затем вы меняете элементы по индексам i и x и выполняете задание.
Но подождите, нет необходимости, чтобы индекс x удерживал i (и вы завершаете исправление этих местоположений всего за один обмен). Скорее, возможно, что индекс x содержит значение y, которое снова будет больше i, поскольку массив сортируется только до местоположения i.
Теперь, прежде чем вы сможете исправить положение i, вам нужно исправить x, почему? мы увидим позже.
Итак, теперь вы пытаетесь исправить положение x, а затем аналогичным образом попытаетесь исправить до тех пор, пока вы не увидите элемент i в каком-либо месте в моде.
Мода должна следовать по ссылке от arr [i], пока вы не нажмете элемент i в каком-то индексе.
Гарантируется, что вы обязательно ударите меня в определенном месте, следуя таким образом. Зачем ? попробуйте доказать это, сделайте несколько примеров, и вы почувствуете это.
Теперь вы начнете фиксировать весь индекс, который вы видели по пути, следующему от индекса i до этого индекса (скажем, j). Теперь вы видите, что путь, которым вы следовали, является круглым, и для каждого индекса i, arr [i] обрабатывается в его предыдущем индексе (индекс от того, где вы сюда пришли), и как только вы увидите, что можете исправить индексы и пометить все из них в массиве FIX, чтобы они были истинными. Теперь переходим к следующему индексу массива и делаем то же самое до тех пор, пока не будет исправлен целый массив.
Это была полная идея, но для того, вы свопите, что после того, как вы нашли цикл из n элементов, вам понадобятся n свопов, и после этого вы исправите массив и снова продолжите. Так вот как вы будете считать нет. свопов. Пожалуйста, дайте мне знать, если у вас есть сомнения в подходе. Вы также можете обратиться за помощью к C/C++.
Рад помочь :-)