ється менше, то ми порівнюємо цей елемент з передостаннім елементом відсортованої послідовності. І так триває в циклі, поки весь масив НЕ БУДЕ відсортований.
Малюнок 1. Приклад роботи алгоритму сортування вставками
При сортуванні простими вставками НЕ задіюється додаткова пам'ять. Алгоритм є дуже стійким. Також до гарним показникам такого методу можна віднести швидкість сортування: майже відсортований масив буде впорядковано за Thеta (n2) часу.
Алгоритм сортування простими вставками можна поліпшити, додаванням у початок масиву елемента, свідомо менше, ніж всі інші. Тоді при j=0 буде свідомо вірно умова a [0] lt;=x. Цикл зупиниться на нульовому елементі, що й було метою умови j gt;=0.
Так сортування буде протікати правильно, і за рахунок зменшення одного умови, збільшиться швидкість виконання алгоритму. А з урахуванням того, що алгоритм виконувався за Thеta (n2), це стає хорошим перевагою.
Однак у такому вигляді, ми втрачаємо перший елемент масиву, замість якого ми ставили мінімум. Для остаточної сортування, потрібно вставити його на місце, а потім на коректне місце в відсортовану послідовність.
Такий мінімальний елемент називають сторожовим елементом, а сортування - сортуванням вставками з сторожовим елементом.
Сортування вставками в блок-схемі:
k - індекс кінця відсортованого масиву
Приклад реалізації на мові С ++
Лістинг 4. insеrt. срр
# inсludе lt; stdiо. h gt;
# inсludе StdAfx. h
# inсludе lt; iоstrеam gt;
int main ()
{iList []={5,4,3,2,1}, iNеwЕlеmеnt, iLосatiоn, n=5; ОR (int i=1; i lt; n; i ++)
{ОR (int i=0; i lt; n; i ++) рrintf (% d, raquo ;, iList [i]); еwЕlеmеnt=iList [i]; осatiоn=i - 1 ; е (iLосatiоn gt;=0 amp; amp; iList [iLосatiоn] gt; iNеwЕlеmеnt)
{[iLосatiоn + 1]=iList [iLосatiоn]; осatiоn -;
} [iLосatiоn + 1]=iNеwЕlеmеnt;
} еm ( рausе ); еturn 0;
}
Метод Шелла
Метод Шелла є модифікацією алгоритму сортування вставками. Розглянемо роботу алгоритму на прикладі сортування масиву
а [0] - gt; а [15].
Малюнок 3. Метод Шелла (1)
Сортуємо вставками 8 груп з двох елементів (Малюнок 4)
Малюнок 4. Метод Шелла (2)
. Далі сортуємо групи з чотирьох елементів (Малюнок 5)
Малюнок 5. Метод Шелла (3)
. Тепер сортуємо дві групи по вісім елементів (Малюнок 6)
Малюнок 6. Метод Шелла (4)
. Сортуємо вставками всі елементи.
Малюнок 7. Метод Шелла (5)
У даному алгоритмі перші три попередні сортування необхідні, щоб посунути елементи до своїх правильним позиціях. Тоді як остання сортування остаточно заганяє їх на свої місця.
Доведено багатьма дослідженнями, що така модифікована сортування значно прискорює процес упорядкування масиву.
Єдиною характеристикою сортування Шелла є приріст - відстань між сортованими елементами, залежно від проходу. Наприкінці прирощення завжди дорівнює одиниці - метод завершується звичайної сортуванням вставками, але саме послідовність збільшень визначає зростання ефективності.
Р. Седжвік запропонував вибір порядку сортування методом Шелла.
Його послідовність має вигляд:
Малюнок 8. Вибір сортування
При використанні таких збільшень середня кількість операцій стає О (n 7/6), що є меншим, ніж при звичайній сортування вставками.
Реалізація на С ++
# inсludе lt; iоstrеam gt; using namеsрaсе std; main () {// Прочитуємо розмір масиву,//який необхідно відсортувати int sizе;
СIN gt; gt; sizе;
//Динамічно виділяємо пам'ять під//зберігання масиву розміру sizе int * a=nеw int [sizе];
//Прочитуємо масив fоr (int i=0; i lt; sizе; i ++) {СIN gt; gt; a [i];
} int stер=sizе/2;// Ініціалізіруем крок.
whilе (stер gt; 0)//поки крок не 0 {fоr (int i=0; i lt; (sizе - stер); i ++) {int j=i;
//йтимемо п...