- Огляд
- Загальний алгоритм
- Псевдокод
- Ілюстрація
- Приклад на C++
- Приклад на Java
- Аналіз складності алгоритму сортування вставками
- Висновок
Поглиблений розгляд сортування вставками на класичних прикладах.
Сортування вставкою - це техніка сортування, яку можна розглядати так само, як ми граємо в карти під рукою. Так само, як ми вставляємо будь-яку карту в колоду або виймаємо її, сортування вставкою працює аналогічним чином.
Алгоритм сортування вставками є більш ефективним, ніж сортування бульбашками та сортування вибором, але менш ефективним, ніж інші методи, такі як швидке сортування та сортування злиттям.
Огляд
У техніці сортування вставками ми починаємо з другого елемента, порівнюємо його з першим і поміщаємо у відповідне місце. Потім ми виконуємо цей процес для наступних елементів.
Ми порівнюємо кожен елемент з усіма його попередніми елементами і ставимо або вставляємо елемент у потрібну позицію. Техніка сортування вставкою є більш доцільною для масивів з меншою кількістю елементів. Вона також корисна для сортування зв'язаних списків.
Зв'язані списки мають вказівник на наступний елемент (у випадку однозв'язного списку) і вказівник на попередній елемент (у випадку двозв'язного списку). Таким чином, для зв'язаного списку стає простіше реалізувати сортування вставкою.
У цьому уроці ми розглянемо все про сортування вставками.
Загальний алгоритм
Крок 1 : Повторіть кроки з 2 по 5 для K = 1 до N-1
Крок 2 : set temp = A[K]
Крок 3 : нехай J = K - 1
Крок 4 : Repeat while temp <=A[J]
set A[J + 1] = A[J]
встановити J = J - 1
[кінець внутрішнього циклу].
Крок 5 : set A[J + 1] = temp
[кінець циклу].
Крок 6 : вихід
Таким чином, у техніці сортування вставкою ми починаємо з другого елемента, оскільки припускаємо, що перший елемент завжди відсортований. Потім, починаючи з другого елемента і до останнього, ми порівнюємо кожен елемент з усіма його попередніми елементами і ставимо цей елемент у відповідну позицію.
Псевдокод
Нижче наведено псевдокод для сортування вставками.
procedure insertionSort(array,N ) array - масив для сортування N- кількість елементів begin int freePosition int insert_val for i = 1 to N -1 do: insert_val = array[i] freePosition = i //знаходимо вільну позицію для вставки елементу whilefreePosition> 0 and array[freePosition -1]>insert_val do: array [freePosition] = array [freePosition -1] freePosition = freePosition -1 end while //вставляємономер у вільній позиції array [freePosition] = insert_val end for end procedure
Вище наведено псевдокод для сортування вставкою, далі ми проілюструємо цю техніку на наступному прикладі.
Ілюстрація
Масив, який потрібно відсортувати, має наступний вигляд:
Тепер на кожному проході ми порівнюємо поточний елемент з усіма його попередніми елементами. Отже, на першому проході ми починаємо з другого елемента.
Таким чином, для повного сортування масиву, що містить N елементів, потрібно N проходів.
Наведену вище ілюстрацію можна узагальнити в табличній формі:
Перепустка. | Невідсортований список | порівняння | Відсортований список |
---|---|---|---|
1 | {12,3,5,10,8,1} | {12,3} | {3,12,5,10,8,1} |
2 | {3,12,5,10,8,1} | {3,12,5} | {3,5,12,10,8,1} |
3 | {3,5,12,10,8,1} | {3,5,12,10} | {3,5,10,12,8,1} |
4 | {3,5,10,12,8,1} | {3,5,10,12,8} | {3,5,8,10,12,1} |
5 | {3,5,8,10,12,1} | {3,5,8,10,12,1} | {1,3,5,8,10,12} |
6 | {} | {} | {1,3,5,8,10,12} |
Як показано на ілюстрації вище, ми починаємо з 2-го елемента, оскільки припускаємо, що перший елемент завжди відсортований. Отже, ми починаємо з порівняння другого елемента з першим і міняємо місцями, якщо другий елемент менший за перший.
Цей процес порівняння та заміни позиціонує два елементи на їхніх місцях. Далі ми порівнюємо третій елемент з попередніми (першим та другим) і виконуємо ту саму процедуру, щоб розмістити третій елемент на належному місці.
Таким чином, за кожен прохід ми розміщуємо один елемент на своє місце. За перший прохід ми розміщуємо другий елемент на своє місце. Таким чином, загалом, щоб розмістити N елементів на своїх місцях, нам потрібно N-1 проходів.
Далі ми продемонструємо реалізацію техніки сортування вставками на мові C++.
Приклад на C++
#include using namespace std; int main () { int myarray[10] = { 12,4,3,1,15,45,33,21,10,2}; cout<<"\nInput list is \n"; for(int i=0;i<10;i++) { cout <="" Виходьте:
Список вхідних даних
12 4 3 1 15 45 33 21 10 2
Відсортований список має вигляд
1 2 3 4 10 12 15 21 33 45
Далі ми розглянемо реалізацію методу сортування вставками на Java.
Приклад на Java
public class Main { public static void main(String[] args) { int[] myarray = {12,4,3,1,15,45,33,21,10,2}; System.out.println("Вхідний список елементів..."); for(int i=0;i<10;i++) { System.out.print(myarray[i] + " "); } for(int k=1; k=0 &&& temp <= myarray[j]) { myarray[j+1] = myarray[j]; j = j-1; } myarray[j+1] = temp; } System.out.println("\Вивідний список елементів..."); for(inti=0;i<10;i++) { System.out.print(myarray[i] + " "); } } }Виходьте:
Вхідний список елементів ...
12 4 3 1 15 45 33 21 10 2
відсортований список елементів ...
1 2 3 4 10 12 15 21 33 45
В обох реалізаціях ми бачимо, що ми починаємо сортування з 2-го елемента масиву (змінна циклу j = 1) і неодноразово порівнюємо поточний елемент з усіма його попередніми елементами, а потім сортуємо елемент, щоб помістити його в правильне положення, якщо поточний елемент не в порядку з усіма його попередніми елементами.
Сортування вставкою працює найкраще і може бути виконане за меншу кількість проходів, якщо масив частково відсортовано. Але зі збільшенням списку його продуктивність знижується. Ще однією перевагою сортування вставкою є те, що це стабільне сортування, тобто воно зберігає порядок однакових елементів у списку.
Аналіз складності алгоритму сортування вставками
Судячи з псевдокоду та ілюстрації вище, сортування вставкою є ефективнішим алгоритмом порівняно з сортуванням бульбашками або сортуванням вибором. Замість циклу for та умов present, він використовує цикл while, який не виконує більше ніяких додаткових дій під час сортування масиву.
Однак, навіть якщо ми передамо відсортований масив методу сортування вставкою, він все одно виконає зовнішній цикл for, вимагаючи n кроків для сортування вже відсортованого масиву. Це робить оптимальну часову складність сортування вставкою лінійною функцією від N, де N - кількість елементів у масиві.
Таким чином, нижче наведено різні рівні складності для техніки сортування вставками:
Найгірший випадок часової складності O(n 2 ) Найкраща часова складність у найкращому випадку O(n) Середня складність за часом O(n 2 ) Складність простору O(1) Незважаючи на ці складнощі, можна зробити висновок, що сортування вставками є найефективнішим алгоритмом у порівнянні з іншими методами сортування, такими як сортування бульбашками та сортування вибором.
Висновок
Сортування вставкою є найефективнішим з усіх трьох методів, розглянутих вище. Тут ми припускаємо, що перший елемент сортується, а потім ми повторно порівнюємо кожен елемент з усіма його попередніми елементами, а потім розміщуємо поточний елемент на його правильну позицію в масиві.
У цьому уроці, обговорюючи сортування вставкою, ми помітили, що ми порівнюємо елементи з кроком 1, а також, що вони є суміжними. Ця особливість призводить до того, що для отримання відсортованого списку потрібно більше проходів.
У наступному уроці ми обговоримо сортування оболонкою, яке є поліпшенням сортування виділенням.
У сортуванні оболонкою ми вводимо змінну, відому як "приріст" або "проміжок", за допомогою якої ми ділимо список на підсписки, що містять несуміжні елементи з "проміжками" один від одного. Сортування оболонкою вимагає меншої кількості проходів порівняно з сортуванням вставкою, а також працює швидше.
У наступних уроках ми розглянемо два методи сортування - "Швидке сортування" і "Сортування злиттям", які використовують стратегію "Розділяй і володарюй" для сортування списків даних.