Szukaj…


Uwagi

Analizując wydajność algorytmu sortowania, interesujemy się przede wszystkim liczbą porównań i wymian.

Średnia wymiana

Niech E n będzie całkowitą średnią liczbą wymiany do sortowania tablicy N elementu. E 1 = 0 (nie potrzebujemy wymiany na tablicę z jednym elementem). Średnia liczba wymiany do sortowania tablicy elementów N jest sumą średniej liczby wymiany do sortowania tablicy elementów N-1 ze średnią wymianą do wstawienia ostatniego elementu do tablicy elementów N-1.

wprowadź opis zdjęcia tutaj

Uprość sumowanie (szeregi arytmetyczne)

wprowadź opis zdjęcia tutaj

Rozszerza termin

wprowadź opis zdjęcia tutaj

Ponownie uprość sumowanie (szeregi arytmetyczne)

wprowadź opis zdjęcia tutaj

Średnie porównanie

Niech C n będzie całkowitą średnią liczbą porównań do tablicy sortowania elementu N. C 1 = 0 (nie potrzebujemy żadnego porównania na tablicy z jednym elementem). Średnia liczba porównań do tablicy elementów sortowania N jest sumą średniej liczby porównań do tablicy elementów sortowania N-1 ze średnim porównaniem do wstawienia ostatniego elementu do tablicy elementów N-1. Jeśli ostatni element jest największym elementem, potrzebujemy tylko jednego porównania, jeśli ostatni element jest drugim najmniejszym elementem, potrzebujemy porównania N-1. Jeśli jednak ostatni element jest najmniejszym elementem, nie potrzebujemy porównania N. Nadal potrzebujemy tylko porównania N-1. Dlatego usuwamy 1 / N w poniższym równaniu.

wprowadź opis zdjęcia tutaj

Uprość sumowanie (szeregi arytmetyczne)

wprowadź opis zdjęcia tutaj

Rozwiń ten termin

wprowadź opis zdjęcia tutaj

Ponownie uprość sumowanie (szeregi arytmetyczne i liczby harmoniczne)

wprowadź opis zdjęcia tutaj

Podstawy algorytmu

Sortowanie za pomocą wstawiania jest bardzo prostym, stabilnym algorytmem sortowania na miejscu. Działa dobrze na małych sekwencjach, ale jest znacznie mniej wydajny na dużych listach. Na każdym kroku algorytmy analizują i-ty element danej sekwencji, przesuwając go w lewo, aż znajdzie się we właściwej pozycji.

Ilustracja graficzna

Sortowanie przez wstawianie

Pseudo kod

for j = 1 to length(A)
    n = A[j]
    i = j - 1
    while j > 0 and A[i] > n
        A[i + 1] = A[i]
        i = i - 1
    A[i + 1] = n

Przykład

Rozważ następującą listę liczb całkowitych:

[5, 2, 4, 6, 1, 3]

Algorytm wykona następujące kroki:

  1. [5, 2, 4, 6, 1, 3]
  2. [2, 5, 4, 6, 1, 3]
  3. [2, 4, 5, 6, 1, 3]
  4. [2, 4, 5, 6, 1, 3]
  5. [1, 2, 4, 5, 6, 3]
  6. [1, 2, 3, 4, 5, 6]

Implementacja C #

public class InsertionSort
{
    public static void SortInsertion(int[] input, int n)
    {
        for (int i = 0; i < n; i++)
        {
            int x = input[i];
            int j = i - 1;
            while (j >= 0 && input[j] > x)
            {
                input[j + 1] = input[j];
                j = j - 1;
            }
            input[j + 1] = x;
        }
    }

    public static int[] Main(int[] input)
    {
        SortInsertion(input, input.Length);
        return input;
    }
}

Przestrzeń pomocnicza: O(1)
Złożoność czasu: O(n)

Wdrożenie Haskell

insertSort :: Ord a => [a] -> [a]
insertSort [] = []
insertSort (x:xs) = insert x (insertSort xs)

insert :: Ord a => a-> [a] -> [a]
insert n [] = [n]
insert n (x:xs) | n <= x    = (n:x:xs)
                | otherwise = x:insert n xs


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow