logo

Sortowanie przez wstawianie w Pythonie

Sortowanie przez wstawianie jest prostym i wydajniejszym algorytmem niż poprzedni algorytm sortowania bąbelkowego. Koncepcja algorytmu sortowania przez wstawianie opiera się na talii kart, w której sortujemy karty do gry według konkretnej karty. Ma wiele zalet, ale w strukturze danych dostępnych jest wiele wydajnych algorytmów.

Podczas gry w karty porównujemy ze sobą ręce kart. Większość graczy lubi sortować karty w kolejności rosnącej, aby szybko zobaczyć, jakie kombinacje mają do dyspozycji.

Implementacja sortowania przez wstawianie jest łatwa i prosta, ponieważ jest ogólnie nauczana na początku lekcji programowania. To jest w miejscu I stabilny algorytm jest to bardziej korzystne w przypadku prawie posortowanych lub mniejszej liczby elementów.

Algorytm sortowania przez wstawianie nie jest tak szybki, ponieważ do sortowania elementów wykorzystuje zagnieżdżoną pętlę.

Rozumiemy następujące terminy.

Co oznacza określenie „na miejscu” i „stabilnie”?

    W miejscu:Algorytm lokalny wymaga dodatkowej przestrzeni bez dbania o rozmiar wejściowy kolekcji. Po wykonaniu sortowania zapisuje oryginalne lokalizacje pamięci elementów kolekcji.Stabilny:Stabilna to termin zarządzający względną kolejnością równych obiektów z początkowej tablicy.

Co ważniejsze, sortowanie przez wstawianie nie wymaga wcześniejszej znajomości rozmiaru tablicy i pobiera pojedynczy element na raz.

Wspaniałą rzeczą w sortowaniu przez wstawianie jest to, że wstawiamy więcej elementów do sortowania - algorytm ustawia je we właściwym miejscu bez wykonywania pełnego sortowania.

Jest bardziej wydajny w przypadku tablicy o małym rozmiarze (mniej niż 10). Przyjrzyjmy się teraz koncepcjom sortowania przez wstawianie.

Pojęcie sortowania przez wstawianie

Tablica rozlana praktycznie na dwie części przy sortowaniu przez wstawianie - An nieposortowana część I posortowane część.

Posortowana część zawiera pierwszy element tablicy, a inna nieposortowana część zawiera resztę tablicy. Pierwszy element nieposortowanej tablicy jest porównywany z posortowaną tablicą, dzięki czemu możemy umieścić go w odpowiedniej podtablicy.

Koncentruje się na wstawianiu elementów poprzez przesuwanie wszystkich elementów, jeśli wartość po prawej stronie jest mniejsza niż lewa strona.

Będzie się to powtarzać, dopóki cały element nie zostanie wstawiony we właściwym miejscu.

Aby posortować tablicę za pomocą sortowania przez wstawianie, poniżej znajduje się algorytm sortowania przez wstawianie.

  • Rozdzieliłem listę na dwie części - posortowaną i nieposortowaną.
  • Wykonaj iterację od arr[1] do arr[n] po podanej tablicy.
  • Porównaj bieżący element z następnym elementem.
  • Jeśli bieżący element jest mniejszy niż następny element, porównaj z poprzednim elementem. Przejdź do większych elementów o jedną pozycję w górę, aby zrobić miejsce dla zamienionego elementu.

Rozumiemy następujący przykład.

Rozważymy pierwszy element w posortowana tablica w poniższej tablicy.

[10, 4, 25, 1, 5]

Pierwszy krok do dodaj 10 do posortowanej podtablicy

[ 10 , 4, 25, 1, 5]

Teraz bierzemy pierwszy element z nieposortowanej tablicy - 4. Przechowujemy tę wartość w nowej zmiennej temp. Teraz , widzimy, że 10>4, następnie przesuwamy 10 w prawo i nadpisujemy 4, które były wcześniej zapisane.

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

Tutaj 4 jest mniejsze niż wszystkie elementy posortowanej podtablicy, więc wstawiamy je na pierwszej pozycji indeksu.

[ 4, 10, 25, 1, 5]

W posortowanej podtablicy mamy dwa elementy.

Teraz sprawdź liczbę 25. Zapisaliśmy ją w temp zmienny. 25> 10, a także 25> 4, następnie umieszczamy je na trzeciej pozycji i dodajemy do posortowanej tablicy podrzędnej.

[ 4, 10, 25, piętnaście]

Ponownie sprawdzamy liczbę 1. Zapisujemy ją temp. 1 jest mniejsza niż 25. Zastępuje 25.

[ 4, 10, 25, 25, 5] 10>1, a następnie ponownie nadpisuje

[ 4, 25, 10, 25, 5]

[ 25, 4, 10, 25, 5] 4>1 teraz wstaw wartość temp = 1

[ 1, 4, 10, 25 , 5]

Mamy teraz 4 elementy w posortowanej podtablicy. 5<25 25 then shift to the right side and pass temp = 5 w lewą stronę.

[ 1, 4, 10, 25 , 25] umieść temp. = 5

Teraz otrzymamy posortowaną tablicę, po prostu umieszczając wartość temp.

xor Java

[1, 4, 5, 10, 25]

Podana tablica jest posortowana.

Realizacja

Implementacja wstawiania jest stosunkowo łatwa. Zaimplementujemy tablicę liczb całkowitych w języku Python. Rozumiemy następujący przykład -

Program w Pythonie

 # 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]:>

Wyjaśnienie:

W powyższym kodzie utworzyliśmy funkcję o nazwie sortowanie_wstawiania(lista1). Wewnątrz funkcji -

  • Zdefiniowaliśmy pętlę for do przeglądania listy od 1 do len(lista1).
  • W pętli for przypisano wartości list1 in wartość Za każdym razem, gdy pętla wykona iterację, nowa wartość zostanie przypisana do zmiennej wartości.
  • Następnie przesunęliśmy elementy listy1[0…i-1], które są większe od wartość, o jedną pozycję przed swoją obecną pozycją.
  • Teraz użyliśmy metody while, aby sprawdzić, czy j jest większe lub równe 0, oraz wartość jest mniejszy niż pierwszy element listy.
  • Jeśli oba warunki są spełnione, przesuń pierwszy element na 0tindeksuj i zmniejszaj wartość j i tak dalej.
  • Następnie wywołaliśmy funkcję, przekazaliśmy listę i wydrukowaliśmy wynik.

Sortowanie obiektów niestandardowych

Python zapewnia elastyczność zmiany algorytmu przy użyciu obiektu niestandardowego. Stworzymy niestandardową klasę i ponownie zdefiniujemy rzeczywisty parametr porównania, starając się zachować ten sam kod, co powyżej.

Wymagalibyśmy przeciążania operatorów, aby posortować obiekty w inny sposób. Ale możemy przekazać kolejny argument do sortowanie przez wstawianie() funkcję za pomocą lambda funkcjonować. Funkcja lambda jest wygodna przy wywoływaniu metody sortowania.

Przyjrzyjmy się poniższemu przykładowi sortowania obiektów niestandardowych.

Najpierw definiujemy Punkt klasa:

Program w Pythonie

 # 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) 

Wyjście:

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

Korzystając z powyższego kodu, możemy posortować punkty współrzędnych. Będzie działać dla każdego typu listy.

Złożoność czasowa w sortowaniu przez wstawianie

Sortowanie przez wstawianie to powolny algorytm; czasami wydaje się, że jest to zbyt wolne w przypadku obszernego zbioru danych. Jest jednak skuteczny w przypadku małych list lub tablic.

Złożoność czasowa sortowania przez wstawianie wynosi - NA2). Do iteracji wykorzystuje dwie pętle.

Kolejną ważną zaletą sortowania przez wstawianie jest to, że; wykorzystuje go popularny algorytm sortowania tzw Sortowanie powłoki.

Przestrzeń pomocnicza w sortowaniu przez wstawianie: O(1)

Wniosek

Sortowanie przez wstawianie to prosty i nieefektywny algorytm, który ma wiele zalet, ale dostępne są bardziej wydajne algorytmy.

W tym samouczku omówiliśmy koncepcję sortowania przez wstawianie i jego implementację przy użyciu języka programowania Python.