Insertion sort (řazení vkládáním) je stabilní řadící algoritmus založený na principu porovnávání řazených hodnot se složitostí . Vylepšením Insertion sortu je výkonnější, ale nestabilní,
Shell sort.
Princip
Insertion sort využívá tohoto myšlenkového postupu:
- Mějmě jeden prvek, ten je triviálně seřazen.
- Vezměme následující prvek a zařaďme jej na správné místo v již seřazených prvcích. (Tímto je nyní seřazeno o jeden prvek více než v předchozím kroku.)
- Dokud pole obsahuje nezařazené prvky, tak GOTO: 2.
Výhody Insertion sortu
Ač se jedná o řazení se složitostí , tak se u téměř seřazeného pole jeho složitost blíží k
– nedochází k posunům, pouze k průchodu. Díky k této výkonnostní výhodě je insertion sort a jeho modifikace často používán jako doplněk k řadícím algoritmům typu rozděl a panuj
(quicksort, merge sort) pro řazení malých polí (pro
je insertion sort rychlejší než quicksort).
Vizualizace
Příklad
(3 2 8 7 6) // Zadání, prvek 3 je triviálně seřazen
(3 2 8 7 6) // Vezmeme dvojku a vložíme jí na správné místo (tam už je)
(3 2 8 7 6) // 8 vložíme na první místo, zbytek čísel posuneme
(8 3 2 7 6) // 7 vložíme mezi 8 a 3, 3 a 2 posuneme
(8 7 3 2 6) // 6 vložíme mezi 7 a 3, čísla 3 a 2 posuneme
(8 7 6 3 2) // seřazeno
(3 2 8 7 6) // Vezmeme dvojku a vložíme jí na správné místo (tam už je)
(3 2 8 7 6) // 8 vložíme na první místo, zbytek čísel posuneme
(8 3 2 7 6) // 7 vložíme mezi 8 a 3, 3 a 2 posuneme
(8 7 3 2 6) // 6 vložíme mezi 7 a 3, čísla 3 a 2 posuneme
(8 7 6 3 2) // seřazeno
Kód
1.
function insertionSort(array a)
2.
for
i in
0
-> a.length -
2
do
3.
j = i +
1
4.
tmp = a[j]
5.
while
j >
0
AND tmp > a[j-
1
]
do
//uvolni misto hodnote
6.
a[j] = a[j-
1
]
7.
j--
8.
a[j] = tmp
//vloz hodnotu
01.
/**
02.
* Razeni vkladanim (od nejvyssiho)
03.
* @param array pole k serazeni
04.
*/
05.
public
static
void
insertionSort(
int
[] array) {
06.
for
(
int
i =
0
; i < array.length -
1
; i++) {
07.
int
j = i +
1
;
08.
int
tmp = array[j];
09.
while
(j >
0
&& tmp > array[j-
1
]) {
10.
array[j] = array[j-
1
];
11.
j--;
12.
}
13.
array[j] = tmp;
14.
}
15.
}
01.
/**
02.
* Razeni vkladanim (od nejvyssiho)
03.
* @param array pole k serazeni
04.
* @param size velikost pole
05.
*/
06.
void
insertionSort(
int
array[],
int
size) {
07.
for
(
int
i = 0; i < size - 1; i++) {
08.
int
j = i + 1;
09.
int
tmp = array[j];
10.
while
(j > 0 && tmp > array[j-1]) {
11.
array[j] = array[j-1];
12.
j--;
13.
}
14.
array[j] = tmp;
15.
}
16.
}
01.
/**
02.
* Razeni vkladanim (od nejvyssiho)
03.
* @param array pole k serazeni
04.
*/
05.
public
static
void
InsertionSort(
int
[] array)
06.
{
07.
for
(
int
i = 0; i < array.Length - 1; i++)
08.
{
09.
int
j = i + 1;
10.
int
tmp = array[j];
11.
while
(j > 0 && tmp > array[j - 1])
12.
{
13.
array[j] = array[j - 1];
14.
j--;
15.
}
16.
array[j] = tmp;
17.
}
18.
}
01.
procedure
Insert(
var
X : ArrayType; N :
integer
);
02.
var
03.
J,
04.
K,
05.
Y :
integer
;
06.
Found :
boolean
;
07.
begin
08.
for
J :=
2
to
N
do
09.
begin
10.
Y := X[J];
11.
K := J -
1
;
12.
Found :=
false
;
13.
while
(K >=
1
)
14.
and
(
not
Found)
do
15.
if
(Y < X[K])
then
16.
begin
17.
X[K +
1
] := X[K];
18.
K := K -
1
19.
end
20.
else
21.
Found :=
true
;
22.
X[K +
1
] := Y;
23.
end
24.
end
;