Сортиране чрез вмъкване: Алгоритъм с C, C++, Java, Python Примери

Какво е сортиране чрез вмъкване?

Сортирането чрез вмъкване е един от алгоритмите за сортиране при сравнение, използвани за сортиране на елементи чрез повторение на елемент по един и поставяне на елемента в правилната му позиция.

Всеки елемент се вмъква последователно във вече сортиран списък. Размерът на вече сортирания първоначално списък е единица. Алгоритъмът за сортиране чрез вмъкване гарантира, че първите k елемента са сортирани след k-тата итерация.

Характеристики на алгоритъма за сортиране чрез вмъкване

Алгоритъмът за сортиране чрез вмъкване има следните важни характеристики:

  • Това е стабилна техника за сортиране, така че не променя относителния ред на равни елементи.
  • Той е ефективен за по-малки набори от данни, но не е ефективен за по-големи списъци.
  • Сортирането чрез вмъкване е адаптивно, което намалява общия брой стъпки, ако е частично сортирано. Array се предоставя като вход, за да бъде ефективен.

Как работи Insert Operaция работа?

В алгоритъма за сортиране чрез вмъкване операцията за вмъкване се използва за сортиране на несортирани елементи. Помага да вмъкнете нов елемент във вече сортиран списък.

Псевдокод на операцията за вмъкване:

Да разгледаме списък A от N елемента.

A[N-1] is the element to be inserted in the sorted sublist A[0..N-2].
For i = N-1 to 1:
if A[i] < A[i-1], then swap A[i] and A[i-1]
else Stop   

Поставете Operaция работа

В горния пример нов елемент 6 трябва да бъде вмъкнат във вече сортиран списък.

Стъпка 1) В сравнение с левия съседен елемент на A[5], 9 > 6, ние разменяме позицията на 9 и 6. Сега елемент 6 е ​​преместен в A[4].

Стъпка 2) Сега сравняваме A[4] и A[3] и откриваме, че A[3] > A[4], отново разменяме позицията на 6 и 8.

Стъпка 3) Сега сравнете A[3] и A[2], като A[2] > A[3] разменят позициите на 7 и 6.

Стъпка 4) Сравняваме A[1] и A[2] и тъй като A[1] < A[2], т.е. левият съседен елемент вече не е по-голям. Сега заключаваме, че 6 е вмъкнато правилно и спираме алгоритъма тук.

Как работи сортирането чрез вмъкване

Операцията за вмъкване, обсъдена по-горе, е гръбнакът на сортирането при вмъкване. Процедурата за вмъкване се изпълнява върху всеки елемент и в крайна сметка получаваме сортирания списък.

Сортирането чрез вмъкване работи

Примерната фигура по-горе демонстрира работата на сортирането чрез вмъкване в структурата на данните. Първоначално в сортирания подсписък има само един елемент, т.е. 4. След вмъкване на A[1], т.е. 3, размерът на сортирания подсписък нараства до 2.

C++ Програма за сортиране на вмъкване

#include <iostream>
using namespace std;

int main(){
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};
    
    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]); 

    //printing unsorted list
    cout << "\nUnsorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    int current_element,temp;

    for(int i = 1; i < size_unsorted; i++){        
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    cout << "\nSorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    return 0;
}

Изход:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

C код за сортиране на вмъкване

#include <stdio.h>
int main() {
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};

    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]);

    //printing unsorted list
    printf("\nUnsorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    int current_element, temp;

    for(int i = 1; i < size_unsorted; i++){
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    printf("\nSorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    return 0;
}

Изход:

Output:
Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Python Програма за сортиране на вмъкване

#unsorted list
unsorted = [9,8,7,6,5,4,3,3,2,1]

#size of list
size_unsorted = len(unsorted)

#printing unsorted list
print("\nUnsorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

for i in range(1, size_unsorted):
    current_element = unsorted[i]
    j = i - 1
    while j >= 0 and unsorted[j] > current_element:
        #swapping if current element is lesser
        unsorted[j+1], unsorted[j] = unsorted[j], unsorted[j+1]
        j -= 1

#printing sorted list
print("\nSorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

Изход:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Свойства на сортирането чрез вмъкване

Ето важни свойства на сортирането чрез вмъкване:

  • онлайн: Сортирането чрез вмъкване може да сортира елементи, както получава. Тоест, ако вече сме сортирали списък от елементи и сме добавили още няколко елемента към списъците, тогава не е необходимо да стартираме отново цялата процедура за сортиране. Вместо това трябва да повторим само новодобавени елементи.
  • На място: Пространствената сложност на алгоритъма за сортиране чрез вмъкване е постоянна и не изисква допълнително място. Този алгоритъм сортира елементите на място.
  • Стабилен: При сортиране чрез вмъкване не разменяме елементите, ако стойностите им са равни. Например, два елемента, x и y, са равни и x се появява преди y в несортирани списъци, тогава в сортирания списък x ще се появи преди y. Това прави сортирането при вмъкване стабилно.
  • Адаптивно: A алгоритъм за сортиране е адаптивен, ако отнема по-малко време, ако входните елементи или подмножество от елементи вече са сортирани. Както обсъдихме по-горе, най-доброто време за изпълнение на сортирането при вмъкване е O(N), а най-лошото време за изпълнение е O(N^2). Сортирането чрез вмъкване е един от адаптивните алгоритми за сортиране.

Сложност на сортирането при вмъкване

Сложност на пространството

Сортирането чрез вмъкване не изисква допълнително пространство за сортиране на елементите, пространствената сложност е постоянна, т.е. O(1).

Сложност във времето

Тъй като сортирането чрез вмъкване итерира всеки елемент едновременно, това изисква N-1 преминавания за сортиране на N елемента. За всяко преминаване може да направи нулеви размени, ако елементите вече са сортирани, или да размени, ако елементите са подредени в низходящ ред.

  • За преминаване 1 минималните необходими суапове са нула, а максималните необходими суапове са 1.
  • За преминаване 2 минималните необходими суапове са нула, а максималните необходими суапове са 2.
  • За преминаване N минималният необходим суап е нула, а максималните необходими суапове са N.
  • Минималният суап е нула, така че най-добрата времева сложност е O(N) за итериране на N преминавания.
  • Общите максимални суапове са (1+2+3+4+..+N) i. N(N+1)/2, най-лошата времева сложност е O(N^2).

Ето важната времева сложност на сортирането на вмъкване:

  • Сложност в най-лошия случай: O(n2): Сортирането на масив в низходящ ред, когато е във възходящ ред, е най-лошият сценарий.
  • Сложност в най-добрия случай: O(n): Сложността в най-добрия случай възниква, когато масивът вече е сортиран, външният цикъл се изпълнява n брой пъти, докато вътрешният цикъл изобщо не се изпълнява. Има само n на брой сравнения. Така че в този случай сложността е линейна.
  • Средна сложност на случая: O(n2): Това се случва, когато елементите на масив се срещат в разбъркан ред, който не е нито възходящ, нито низходящ.

Oбобщение

  • Сортирането чрез вмъкване е метод на алгоритъм за сортиране, който се основава на сравнението.
  • Това е стабилна техника за сортиране, така че не променя относителния ред на равни елементи.
  • Във всеки елемент операцията за вмъкване се използва за вмъкване на елемента в сортирания подсписък.
  • Сортирането чрез вмъкване е алгоритъм за сортиране на място.
  • Най-лошата и средна времева сложност на сортирането при вмъкване е квадратична, т.е. O(N^2).
  • Сортирането чрез вмъкване не изисква допълнително пространство.