Ten rodzaj sortowania możemy porównać do układania kart pokerzysty. Pierwszą kartę wstawiamy w odpowiednie miejsce przesuwając pozostałe, następną także wstawiamy między odpowiednie karty i tak układamy zestaw kart.
Prześledźmy przykład na następującym ciągu liczb:
$$2,\ 5,\ 3,\ 0,\ 7,\ 1$$
Strategia algorytmu:
Dla przykładowego ciągu wygląda to następująco:
Sortowanie przez wstawianie można zaliczyć do atrakcyjniejszych algorytmów. Chociaż jego złożoność jest rzędu $$O(n^2)$$, a więc nie należy do najszybszych, to algorytm ma swoje zalety:
Algorytm najwięcej porównań elementów musi wykonać w przypadku pesymistycznej wersji zbioru danych (elementy posortowane są malejąco):
$$0+1+2+3+...+n-1=\frac{n\cdot (n-1)}{2}$$.
Rozwiązanie w C++:
//algorytm.edu.pl
#include<iostream>
using namespace std;
void sortowanie_przez_wstawianie(int n, int *tab)
{
int pom, j;
for(int i=1; i<n; i++)
{
//wstawienie elementu w odpowiednie miejsce
pom = tab[i]; //ten element będzie wstawiony w odpowiednie miejsce
j = i-1;
//przesuwanie elementów większych od pom
while(j>=0 && tab[j]>pom)
{
tab[j+1] = tab[j]; //przesuwanie elementów
--j;
}
tab[j+1] = pom; //wstawienie pom w odpowiednie miejsce
}
}
int main()
{
int n, *tab;
cout<<"Podaj wielkość zbioru: ";
cin>>n;
tab = new int [n];
for(int i=0; i<n; i++)
{
cout<<"Podaj "<<i+1<<" element: ";
cin>>tab[i];
}
cout<<"Elementy przed sortowaniem:\n";
for(int i=0; i<n; i++)
cout<<tab[i]<<" ";
sortowanie_przez_wstawianie(n, tab);
cout<<"\nElementy posortowaniem:\n";
for(int i=0; i<n; i++)
cout<<tab[i]<<" ";
cin.ignore();
cin.get();
return 0;
}