W swojej istocie sortowanie przez wstawianie jest algorytmem sortującym. Umożliwia on umieszczanie różnych nieposortowanych elementów w miejscach, które są dla nich najbardziej odpowiednie w każdej iteracji. Można powiedzieć, że ten algorytm działa podobnie do sortowania kart w rękach. Jeśli masz doświadczenie z grą w karty, wiesz, że gracze sortują karty z założeniem, że pierwsze karty są już posortowane, a następnie wybierają te nieposortowane.
Jeśli nieposortowana karta okaże się większa od karty w ręce gracza, musi on umieścić ją po prawej stronie. W przeciwnym razie gracz musi zatrzymać kartę po lewej stronie. W podobny sposób należy umieścić pozostałe nieposortowane karty i pozostawić je na swoich miejscach. Podejście stosowane w sortowaniu przez wstawianie jest bardzo podobne do tego.
Podstawy działania sortowania przez wstawianie
Poniżej opisano trzy kroki, które pozwolą Ci zrozumieć, jak działa sortowanie przez wstawianie:
- W pierwszym kroku elementy, o których mowa, są porównywane z elementami sąsiadującymi z nimi
- Jeśli z każdego porównania wynika, że dany element może być użyty w określonym miejscu, to robi się dla niego miejsce. Dokonuje się tego poprzez przesunięcie pozycji innych elementów w prawo.
- Procedura ta jest kontynuowana do momentu, gdy każdy element znajdujący się w tablicy znajdzie swoje właściwe miejsce.
Charakterystyka sortowania przez wstawianie
Algorytm sortowania in-place ma wiele różnych cech, ale są trzy ważne, z którymi każdy musi się zapoznać.
- Po pierwsze, algorytm sortowania przez wstawianie jest niewiarygodnie prosty. Niektórzy powiedzieliby nawet, że jest najprostszym z nich ze względu na jego prostą implementację.
- Jeśli jesteś programistą, który regularnie ma do czynienia z małymi wartościami danych, zastosowanie tego algorytmu będzie całkiem przydatne.
- Algorytm sortowania przez wstawianie jest dość adaptacyjny, co czyni go idealnym rozwiązaniem dla częściowo posortowanych zbiorów danych.
Najczęściej zadawane pytania dotyczące sortowania przez wstawianie
Poniżej znajduje się lista zwięzłych odpowiedzi na najczęściej zadawane pytania dotyczące algorytmów sortowania przez wstawianie.
Co to są przypadki brzegowe algorytmu sortowania przez wstawianie?
Sortowanie przez wstawianie wymaga dużej ilości czasu, gdy trzeba posortować elementy w odwrotnej kolejności. Jeśli jednak elementy są już posortowane, nie będzie to wymagało wiele czasu.
Czy algorytmy sortowania przez wstawianie są stabilne?
Algorytmy sortowania przez wstawianie są niezwykle stabilne, zwłaszcza gdy porównamy je z innymi algorytmami.
Kiedy najlepiej używać algorytmu sortowania przez wstawianie?
Jak wspomniano wcześniej, algorytm sortowania przez wstawianie jest często stosowany, gdy liczba elementów jest niewielka. Może on być również przydatny, gdy tablica danych wejściowych nie wymaga zbyt dużego sortowania i ma tylko kilka błędnie umieszczonych elementów.
Jakie podejście stosuje sortowanie przez wstawianie?
Podejście stosowane przez algorytm sortowania przez wstawianie jest przyrostowe, dlatego jest on niezwykle popularny wśród programistów sortujących tablice.
Wyjaśnienie binarnego sortowania przez wstawianie
Programiści mogą wykorzystać wyszukiwanie binarne do zmniejszenia liczby porównań występujących w zwykłym sortowaniu przez wstawianie. Binarne sortowanie przez wstawianie wykorzystuje wyszukiwanie do znalezienia idealnego miejsca do wstawienia wybranego elementu w każdej iteracji. Jeśli chodzi o zwykłe wstawianie, to w najgorszym przypadku sortowanie wykorzystuje O(i) (w i-tej iteracji).
Możemy wykorzystać badania binarne, aby zredukować je do tego: O(logi). Mimo to algorytm nadal ma czas działania około O(n^2) dla najgorszych przypadków. Wynika to z liczby zamian potrzebnych na każde wstawienie.
Kroki implementacji sortowania przez wstawianie w listach połączonych
Poniższe kroki pokazują, jak można wykorzystać algorytm sortowania przez wstawianie w listach połączonych.
- Zacznij od utworzenia posortowanej listy, upewniając się, że jest ona pusta.
- Przejdź przez utworzoną listę i wykonaj następujące kroki dla każdego węzła
- Podaj bieżący węzeł w postaci wyniku lub posortowanej listy
- Na koniec zmień nagłówek listy połączonej, czyniąc go nagłówkiem listy posortowanej, czyli listy wyników.
Główne zastosowania sortowania przez wstawianie
Oto dwa najczęstsze scenariusze, w których programiści wykorzystują sortowanie przez wstawianie.
– Po pierwsze, używa się go zawsze wtedy, gdy mamy do czynienia z tablicą zawierającą kilka elementów
– Sortowanie przez wstawianie może być również przydatne, gdy do posortowania jest tylko niewielka liczba elementów.
Złożoność czasowa sortowania przez wstawianie
Oto przykład złożoności czasowej, z jaką można się spotkać podczas sortowania przez wstawianie.
Złożoność najgorszego przypadku O (n2) – Worst Case Complexity O (n2)
Wyobraźmy sobie, że istnieje tablica w porządku rosnącym, którą chcemy posortować w porządku malejącym. W takim przypadku mamy do czynienia z najgorszym przypadkiem złożoności. W takiej sytuacji należy porównać każdy element z innymi elementami, aby zapewnić (n-1) porównań dla każdego n-tego elementu.
Całkowita liczba porównań będzie wynosić n*(n-1) ~ n2.
Złożoność przypadku średniego O(n) – Average Case Complexity O(n)
Ten typ złożoności ma miejsce często, gdy elementy tablicy są pomieszane, co oznacza, że nie są ułożone ani w porządku malejącym, ani rosnącym.
Złożoność przestrzenna – Space Complexity
Złożoność przestrzenna staje się 0(1) zawsze, gdy mamy do czynienia z implementacją dodatkowej zmiennej.
Złożoność w najlepszym przypadku – Best Case Complexity
Gdy tablica nie wymaga sortowania, liczba powtórzeń w pętli zewnętrznej wynosi n. Z drugiej strony pętla wewnętrzna pozostaje bezczynna i nie wykonuje żadnych operacji. Oznacza to, że liczba porównań będzie wynosiła n, co daje złożoność liniową.
Analiza złożoności czasowej
Nie da się zaprzeczyć, jak wydajne jest sortowanie przez wstawianie, ale jeśli do sortowania przez wstawianie podamy tablicę, która jest już posortowana, to algorytm nadal będzie wykonywał pozostałe czynności w pętli. Będzie to wymagało wykonania n kroków w celu posortowania tablicy składającej się z n elementów, które zostały już posortowane na początku, co zasadniczo zmieni złożoność czasową najlepszego przypadku w funkcję liniową n.
Tablica nieposortowana wymaga elementu do porównywania z innymi elementami, co oznacza, że każdy element n jest porównywany z innymi n elementami. Pomocne byłoby również przeanalizowanie innych podobnych algorytmów, takich jak Quick Sort, Merge Sort czy Selection Sort, i określenie ich złożoności.