2015-04-20 4 views
0

Часть 1
Я знаю, что QuickSort можно использовать «на месте», но может кто-нибудь объяснить мне, как вставки рода алгоритм делает это с помощью «на месте».Вставка Сортировка Алгоритм В месте и петли вариант

Из моего понимания:

вставки Сортировка начинается с первого значения и сравнивает его к следующему значению, если это значение меньше нашего значения они меняются местами. Мы продолжаем это рекурсивно. (Краткое объяснение)

Так вы бы сказали, что это «на месте», потому что мы не создаем новый массив для этого, а просто сравниваем два элемента в массиве?

Если мое понимание было неправильным, то кто-то может объяснить алгоритм для вставки сортировки на месте.

Часть 2
Кроме того, как бы я использовать вставки рода, чтобы проиллюстрировать идею цикла инвариантного?

Я знаю, что инвариант цикла является условием, которое сразу истинно до и после каждой итерации цикла, но я не уверен, как это будет относиться к сортировке вставки.

+1

Что вы описываете, это сортировка пузырьков, а не сортировка вставки. –

+0

Книга, которую я использую, задала эти вопросы и относится к сортировке вставки. Редактирование: я думаю, что я неправильно понял вас, вы говорите, что мое объяснение сортировки вставки действительно похоже на пузырь? – Aceboy1993

+0

Да. Bubble Sort работает, сравнивая i с i + 1, и если они находятся в неправильном порядке, переключитесь. В Insertion Sort нет переключателя. Вы берете элемент x, начинаете с первой позиции, и если вы найдете элемент y, который больше x, вы вставляете x перед y, тем самым перемещая остальную часть массива вправо. Оба Bubble Sort и Insertion Sort могут быть реализованы на месте - они просто работают по-разному. http://en.wikipedia.org/wiki/Insertion_sort –

ответ

0

Как и 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), в отличие от размера массива, а вид - это место, очень похоже на пузырь.

+0

Ну, вставка сортировки может быть реализована на месте. Это просто работает по-другому, чем Bubble Sort :-) http://en.wikipedia.org/wiki/Insertion_sort –

+0

Спасибо за объяснение, но я описал пузырь по ошибке, я хочу знать, как сортировка вставки будет работать на месте и как вставка сортировки может быть использована для иллюстрации идеи инварианта цикла – Aceboy1993

+0

Обновление ответа сейчас ... –

 Смежные вопросы

  • Нет связанных вопросов^_^