Как и Thorsten, упомянутый в разделе комментариев, вы описали сортировку пузырьков. Модифицированный из Wikipedia, псевдокода для пузырьковой сортировки представлена следующим образом:
procedure bubbleSort(A : list of sortable items)
n = length(A)
for i = 1 to n inclusive do // Outer Loop
for j = 1 to n-1-i inclusive do
/* if this pair is out of order */
if A[j] > A[j+1] then
swap(A[j], A[j+1])
end if
end for
end for
end procedure
Петля инвариантна в пузырьковой сортировке (для внешнего цикла) будет то, что, после каждой итерации цикла, всего массива до текущего значения i
будет сортироваться. Это связано с тем, что каждый раз, когда он достигает внешнего цикла, он будет проходить через все итерации внутреннего цикла (от i до n-1), найдя там минимальный элемент и заменяя этот элемент на i-й.
Bubble sort, действительно, на месте, поскольку вся сортировка происходит внутри самого исходного массива и не требует отдельного внешнего массива.
Edit- Теперь на сортировку вставками:
Псевдо код выглядит следующим образом (все града Wikipedia):
for i = 1 to length(A) - 1
x = A[i]
j = i
while j > 0 and A[j-1] > x
A[j] = A[j-1]
j = j - 1
end while
A[j] = x[3]
end for
Здесь на каждом шагу, что происходит в том, что для каждого элемента, вы выберите подходящее место для его вставки в массив, т. е. вы вставляете его сразу после первого элемента, который меньше, чем в массиве. Немного более подробно, что делает внутренний цикл, это то, что он перемещает элементы вправо, пока не столкнется с элементом, меньшим, чем рассматриваемый элемент, после чего вы вставляете элемент сразу после меньшего элемента. Это будет означать, что каждый элемент до тех пор, пока вышеупомянутый элемент не будет отсортирован. внешний цикл гарантирует, что это делается для всех элементов в массиве, а это означает, что к моменту завершения внешнего цикла массив сортируется.
Инвариант цикла для внешнего контура, как и раньше, после i-й итерации будет отсортирован по всем элементам до текущего i
. Однако перед i-м вступлением все элементы до i-1
будут отсортированы.
Алгоритм сортировки вставки не требует внешнего массива для сортировки. Более конкретно, все операции выполняются на самом массиве (за исключением одной переменной, которую нам нужно сохранить элемент, который мы сейчас пытаемся вставить в соответствующее место), и не используются внешние массивы - копирование из этого массива отсутствует к другому, например. Таким образом, сложность пространства, требуемая алгоритмом (исключая, конечно, пространство, которое занимает сам массив), будет O (1), в отличие от размера массива, а вид - это место, очень похоже на пузырь.
Что вы описываете, это сортировка пузырьков, а не сортировка вставки. –
Книга, которую я использую, задала эти вопросы и относится к сортировке вставки. Редактирование: я думаю, что я неправильно понял вас, вы говорите, что мое объяснение сортировки вставки действительно похоже на пузырь? – Aceboy1993
Да. Bubble Sort работает, сравнивая i с i + 1, и если они находятся в неправильном порядке, переключитесь. В Insertion Sort нет переключателя. Вы берете элемент x, начинаете с первой позиции, и если вы найдете элемент y, который больше x, вы вставляете x перед y, тем самым перемещая остальную часть массива вправо. Оба Bubble Sort и Insertion Sort могут быть реализованы на месте - они просто работают по-разному. http://en.wikipedia.org/wiki/Insertion_sort –