В този урок ще научите как работи сортирането при вмъкване. Също така ще намерите работещи примери за сортиране на вмъкване в C, C ++, Java и Python.
Сортирането по вмъкване работи по същия начин, както сортираме картите в ръка в игра с карти.
Предполагаме, че първата карта вече е сортирана, тогава избираме несортирана карта. Ако несортираната карта е по-голяма от картата в ръка, тя се поставя вдясно в противен случай, вляво. По същия начин се вземат и други несортирани карти и се поставят на правилното им място.
Подобен подход се използва чрез сортиране на вмъкване.
Сортирането при вмъкване е алгоритъм за сортиране, който поставя несортиран елемент на подходящото място във всяка итерация.
Как работи сортирането при вмъкване?
Да предположим, че трябва да сортираме следния масив.
![](https://cdn.wiki-base.com/2133874/insertion_sort_algorithm.png.webp)
- Предполага се, че първият елемент в масива е сортиран. Вземете втория елемент и го съхранявайте отделно
key
.
Сравнетеkey
с първия елемент. Ако първият елемент е по-голям отkey
, тогава ключът се поставя пред първия елемент.Ако първият елемент е по-голям от ключ, тогава ключът се поставя пред първия елемент.
- Сега първите два елемента са сортирани.
Вземете третия елемент и го сравнете с елементите вляво от него. Поставен е точно зад елемента, по-малък от него. Ако няма елемент по-малък от него, тогава го поставете в началото на масива.Поставете 1 в началото
- По същия начин поставете всеки несортиран елемент в правилната му позиция.
Поставете 4 зад 1
Поставете 3 зад 1 и масивът е сортиран
Алгоритъм за сортиране при вмъкване
insertionSort (масив) маркира първия елемент като сортиран за всеки несортиран елемент X „извлича“ елемента X за j X премества сортирания елемент надясно с 1 цикъл на прекъсване и вмъква X тук end insertionSort
Примери за Python, Java и C / C ++
Python Java C C ++ # Insertion sort in Python def insertionSort(array): for step in range(1, len(array)): key = array(step) j = step - 1 # Compare key with each element on the left of it until an element smaller than it is found # For descending order, change keyarray(j). while j>= 0 and key < array(j): array(j + 1) = array(j) j = j - 1 # Place key at after the element just smaller than it. array(j + 1) = key data = (9, 5, 1, 4, 3) insertionSort(data) print('Sorted Array in Ascending Order:') print(data)
// Insertion sort in Java import java.util.Arrays; class InsertionSort ( void insertionSort(int array()) ( int size = array.length; for (int step = 1; step < size; step++) ( int key = array(step); int j = step - 1; // Compare key with each element on the left of it until an element smaller than // it is found. // For descending order, change keyarray(j). while (j>= 0 && key < array(j)) ( array(j + 1) = array(j); --j; ) // Place key at after the element just smaller than it. array(j + 1) = key; ) ) // Driver code public static void main(String args()) ( int() data = ( 9, 5, 1, 4, 3 ); InsertionSort is = new InsertionSort(); is.insertionSort(data); System.out.println("Sorted Array in Ascending Order: "); System.out.println(Arrays.toString(data)); ) )
// Insertion sort in C #include // Function to print an array void printArray(int array(), int size) ( for (int i = 0; i < size; i++) ( printf("%d ", array(i)); ) printf(""); ) void insertionSort(int array(), int size) ( for (int step = 1; step < size; step++) ( int key = array(step); int j = step - 1; // Compare key with each element on the left of it until an element smaller than // it is found. // For descending order, change keyarray(j). while (key = 0) ( array(j + 1) = array(j); --j; ) array(j + 1) = key; ) ) // Driver code int main() ( int data() = (9, 5, 1, 4, 3); int size = sizeof(data) / sizeof(data(0)); insertionSort(data, size); printf("Sorted array in ascending order:"); printArray(data, size); )
// Insertion sort in C++ #include using namespace std; // Function to print an array void printArray(int array(), int size) ( for (int i = 0; i < size; i++) ( cout << array(i) << " "; ) cout << endl; ) void insertionSort(int array(), int size) ( for (int step = 1; step < size; step++) ( int key = array(step); int j = step - 1; // Compare key with each element on the left of it until an element smaller than // it is found. // For descending order, change keyarray(j). while (key = 0) ( array(j + 1) = array(j); --j; ) array(j + 1) = key; ) ) // Driver code int main() ( int data() = (9, 5, 1, 4, 3); int size = sizeof(data) / sizeof(data(0)); insertionSort(data, size); cout << "Sorted array in ascending order:"; printArray(data, size); )
Сложност
Сложни времена
- Най-лошият сложен случай: Да предположим, че масивът е във възходящ ред и искате да го сортирате в низходящ ред. В този случай възниква най-лошият сложен случай. Всеки елемент трябва да се сравнява с всеки от другите елементи, така че за всеки n-ти елемент се правят сравнения. По този начин общият брой сравнения =
O(n2)
(n-1)
n*(n-1) ~ n2
- Най-добрата сложност:
O(n)
Когато масивът вече е сортиран, външният цикъл се изпълняваn
няколко пъти, докато вътрешният цикъл изобщо не се изпълнява. И така, има самоn
брой сравнения. По този начин сложността е линейна. - Средна сложност на случая: Това се случва, когато елементите на масив са в объркан ред (нито възходящ, нито низходящ).
O(n2)
Сложност на пространството
Сложността на пространството е O(1)
защото се използва допълнителна променлива key
.
Приложения за сортиране по вмъкване
Сортирането на вмъкването се използва, когато:
- масивът има малък брой елементи
- остават само няколко елемента за сортиране