logo

Sortare prin inserție în Python

Sortarea prin inserție este un algoritm simplu și mai eficient decât algoritmul anterior de sortare cu bule. Conceptul de algoritm de sortare prin inserție se bazează pe pachetul cărții în care sortăm cărțile de joc în funcție de o anumită carte. Are multe avantaje, dar există mulți algoritmi eficienți disponibili în structura datelor.

În timpul jocului de cărți, comparăm mâinile de cărți între ele. Majoritatea jucătorilor le place să sorteze cardul în ordine crescătoare, astfel încât să poată vedea rapid ce combinații au la dispoziție.

Implementarea sortării prin inserare este ușoară și simplă, deoarece este predată în general la începutul lecției de programare. Este un la loc și algoritm stabil care este mai benefic pentru elemente aproape sortate sau mai puține.

Algoritmul de sortare prin inserare nu este atât de rapid, deoarece folosește bucla imbricată pentru sortarea elementelor.

Să înțelegem următorii termeni.

Ce înseamnă în loc și stabil?

    La loc:Algoritmul pe loc necesită spațiu suplimentar fără a avea grijă de dimensiunea de intrare a colecției. După efectuarea sortării, rescrie locațiile de memorie originale ale elementelor din colecție.Grajd:Stabilul este un termen care gestionează ordinea relativă a obiectelor egale din tabloul inițial.

Cel mai important lucru, sortarea prin inserare nu necesită cunoașterea dimensiunii matricei în avans și primește câte un element pe rând.

Lucrul grozav despre sortarea prin inserție este dacă inserăm mai multe elemente de sortat - algoritmul aranjează sortarea la locul său fără a efectua sortarea completă.

Este mai eficient pentru matricea de dimensiuni mici (mai puțin de 10). Acum, să înțelegem conceptele de sortare prin inserție.

Conceptul de sortare prin inserare

Matricea s-a vărsat practic în cele două părți în sortarea de inserție - An parte nesortată și sortat parte.

Partea sortată conține primul element al matricei, iar o altă subparte nesortată conține restul matricei. Primul element din matricea nesortată este comparat cu matricea sortată, astfel încât să-l putem plasa într-o sub-matrice adecvată.

Se concentrează pe inserarea elementelor prin mutarea tuturor elementelor dacă valoarea din partea dreaptă este mai mică decât cea din stânga.

Se va întâmpla în mod repetat până când toate elementele sunt introduse la locul corect.

Pentru a sorta matricea folosind sortarea prin inserție, mai jos este algoritmul de sortare prin inserție.

  • A vărsat o listă în două părți - sortată și nesortată.
  • Iterați de la arr[1] la arr[n] peste matricea dată.
  • Comparați elementul curent cu elementul următor.
  • Dacă elementul curent este mai mic decât următorul element, comparați cu elementul anterior, mutați la elementele mai mari cu o poziție în sus pentru a face spațiu pentru elementul schimbat.

Să înțelegem următorul exemplu.

Vom lua în considerare primul element în matrice sortată în următorul tablou.

[10, 4, 25, 1, 5]

Primul pas spre adauga 10 la subbarajul sortat

[ 10 , 4, 25, 1, 5]

Acum luăm primul element din tabloul nesortat - 4. Stocăm această valoare într-o nouă variabilă temp. Acum , putem vedea ca 10>4 apoi il mutam pe 10 la dreapta si care il suprascriu pe 4 care a fost stocat anterior.

[ 10 , 10, 25, 1, 5] (temp = 4)

Aici 4 este mai mic decât toate elementele din subbary sortat, așa că îl inserăm la prima poziție de index.

[ 4, 10, 25, 1, 5]

Avem două elemente în subbarajul sortat.

Acum verificați numărul 25. L-am salvat în temp variabil. 25> 10 și, de asemenea, 25> 4, apoi îl punem în a treia poziție și îl adăugăm la submatricea sortată.

[ 4, 10, 25, cincisprezece]

Din nou verificăm numărul 1. Îl salvăm în temp. 1 este mai mic decât 25. Îl suprascrie pe 25.

[ 4, 10, 25, 25, 5] 10>1 apoi se suprascrie din nou

[ 4, 25, 10, 25, 5]

[ 25, 4, 10, 25, 5] 4>1 pune acum valoarea temp = 1

ubuntu build esențial

[ 1, 4, 10, 25 , 5]

Acum, avem 4 elemente în subbary sortat. 5<25 25 then shift to the right side and pass temp = 5 în partea stângă.

[ 1, 4, 10, 25 , 25] pune temperatura = 5

Acum, obținem matricea sortată punând pur și simplu valoarea temp.

[1, 4, 5, 10, 25]

Matricea dată este sortată.

Implementarea

Implementarea inserției este relativ ușoară. Vom implementa folosind matricea Python de numere întregi. Să înțelegem următorul exemplu -

Programul Python

 # creating a function for insertion def insertion_sort(list1): # Outer loop to traverse through 1 to len(list1) for i in range(1, len(list1)): value = list1[i] # Move elements of list1[0..i-1], that are # greater than value, to one position ahead # of their current position j = i - 1 while j &gt;= 0 and value <list1[j]: list1[j + 1]="list1[j]" j -="1" return list1 # driver code to test above 5, 13, 8, 2] print('the unsorted list is:', list1) sorted insertion_sort(list1)) < pre> <p> <strong>Output:</strong> </p> <pre> The unsorted list is: [10, 5, 13, 8, 2] The sorted list1 is: [2, 5, 8, 10, 13] </pre> <p> <strong>Explanation:</strong> </p> <p>In the above code, we have created a function called <strong>insertion_sort(list1).</strong> Inside the function -</p> <ul> <li>We defined for loop for traverse the list from 1 to <strong>len(list1).</strong> </li> <li>In for loop, assigned a values of list1 in <strong>value</strong> Every time the loop will iterate the new value will assign to the value variable.</li> <li>Next, we moved the elements of list1[0&#x2026;i-1], that are greater than the <strong>value,</strong> to one position ahead of their current position.</li> <li>Now, we used the while to check whether the j is greater or equal than 0, and the <strong>value</strong> is smaller than the first element of the list.</li> <li>If both conditions are true then move the first element to the 0<sup>th</sup> index and reduce the value of j and so on.</li> <li>After that, we called the function and passed the list and printed the result.</li> </ul> <h2>Sorting Custom Objects</h2> <p>Python provides the flexibility to change the algorithm using a custom object. We will create a custom class and redefine the actual comparison parameter and try to keep the same code as the above.</p> <p>We would require to overload the operators in order to sort the objects in a different way. But, we can pass another argument to the <strong>insertion_sort()</strong> function by using the <strong>lambda</strong> function. The lambda function is a convenient when calling the sorting method.</p> <p>Let&apos;s understand the following example of sorting custom objects.</p> <p>First, we are defining the <strong>Point</strong> class:</p> <h3>Python Program</h3> <pre> # Creating Point class class Point: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return str.format(&apos;({},{})&apos;, self.a, self.b) def insertion_sort(list1, compare_function): for i in range(1, len(list1)): Value = list1[i] Position = i while Position &gt; 0 and compare_function(list1[Position - 1], Value): list1[Position] = list1[Position - 1] Position = Position - 1 list1[Position] = Value U = Point(2,3) V = Point(4,4) X = Point(3,1) Y = Point(8,0) Z = Point(5,2) list1 = [U,V,X,Y,Z] # We sort by the x coordinate, ascending insertion_sort(list1, lambda x, y: x.a &gt; y.a) for point in list1: print(point) </pre> <p> <strong>Output:</strong> </p> <pre> The points are in the sorted order (2,3) (3,1) (4,4) (5,2) (8,0) </pre> <p>Using the above code, we can sort the coordinate points. It will work for any type of the list.</p> <h2>Time Complexity in Insertion Sort</h2> <p>Insertion sort is a slow algorithm; sometimes, it seems too slow for extensive dataset. However, it is efficient for small lists or array.</p> <p>The time complexity of the insertion sort is - <strong>O(n<sup>2</sup>).</strong> It uses the two loops for iteration.</p> <p>Another important advantage of the insertion sort is that; it is used by the popular sorting algorithm called <strong>Shell sort.</strong> </p> <p>The auxiliary space in insertion sort: <strong>O(1)</strong> </p> <h2>Conclusion</h2> <p>Insertion sort is a simple and inefficient algorithm that has many advantages, but there are more efficient algorithms are available.</p> <p>In this tutorial, we have discussed the concept of the insertion sort and its implementation using the Python programming language.</p> <hr></list1[j]:>

Explicaţie:

În codul de mai sus, am creat o funcție numită sortare_inserție(lista1). În interiorul funcției -

  • Am definit for loop pentru parcurgerea listei de la 1 la len(lista1).
  • În bucla for, i s-au atribuit valorile list1 în valoare De fiecare dată când bucla va repeta, noua valoare va fi atribuită variabilei valoare.
  • Apoi, am mutat elementele listei1[0...i-1], care sunt mai mari decât valoare, la o poziție înaintea poziției lor actuale.
  • Acum, am folosit while pentru a verifica dacă j este mai mare sau egal decât 0 și valoare este mai mic decât primul element al listei.
  • Dacă ambele condiții sunt adevărate, atunci mutați primul element la 0thindexați și reduceți valoarea lui j și așa mai departe.
  • După aceea, am apelat funcția și am trecut lista și am tipărit rezultatul.

Sortarea obiectelor personalizate

Python oferă flexibilitatea de a schimba algoritmul folosind un obiect personalizat. Vom crea o clasă personalizată și vom redefini parametrul real de comparație și vom încerca să păstrăm același cod ca cel de mai sus.

Ne-ar cere să supraîncărcăm operatorii pentru a sorta obiectele într-un mod diferit. Dar, putem transmite un alt argument la insertion_sort() funcția prin utilizarea lambda funcţie. Funcția lambda este convenabilă atunci când apelați metoda de sortare.

Să înțelegem următorul exemplu de sortare a obiectelor personalizate.

În primul rând, definim Punct clasă:

Programul Python

 # Creating Point class class Point: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return str.format(&apos;({},{})&apos;, self.a, self.b) def insertion_sort(list1, compare_function): for i in range(1, len(list1)): Value = list1[i] Position = i while Position &gt; 0 and compare_function(list1[Position - 1], Value): list1[Position] = list1[Position - 1] Position = Position - 1 list1[Position] = Value U = Point(2,3) V = Point(4,4) X = Point(3,1) Y = Point(8,0) Z = Point(5,2) list1 = [U,V,X,Y,Z] # We sort by the x coordinate, ascending insertion_sort(list1, lambda x, y: x.a &gt; y.a) for point in list1: print(point) 

Ieșire:

 The points are in the sorted order (2,3) (3,1) (4,4) (5,2) (8,0) 

Folosind codul de mai sus, putem sorta punctele de coordonate. Va funcționa pentru orice tip de listă.

Complexitatea timpului în sortarea inserției

Sortarea prin inserare este un algoritm lent; uneori, pare prea lent pentru un set de date extins. Cu toate acestea, este eficient pentru liste sau matrice mici.

Complexitatea temporală a sortării de inserare este - Pe2). Folosește cele două bucle pentru iterație.

Un alt avantaj important al sortării de inserare este că; este folosit de popularul algoritm de sortare numit Sortare Shell.

Spațiul auxiliar în sortarea inserției: O(1)

Concluzie

Sortarea prin inserție este un algoritm simplu și ineficient, care are multe avantaje, dar sunt disponibili algoritmi mai eficienți.

În acest tutorial, am discutat despre conceptul de sortare prin inserție și implementarea acestuia folosind limbajul de programare Python.