Řazení výběrem
Řazení výběrem je v informatice implementačně jednoduchý řadicí algoritmus s časovou složitostí O(N²). Pro svou jednoduchou implementaci a nízký overhead bývá často používán pro uspořádávání malých množství dat. Pro větší objem dat se používají algoritmy s nižší časovou složitostí O(N log N) jako řazení haldou nebo řazení slučováním.
Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků), pracuje lokálně (nevyžaduje pomocnou paměť), není stabilním (prvkům se stejným klíčem může změnit vzájemnou polohu) a nepatří mezi přirozené řadicí algoritmy (částečně seřazený seznam se bude zpracovávat stejně dlouho jako neseřazený).
Princip
Budeme uvažovat o vzestupném řazení. Seřazenou část budeme mít vlevo a vždy budeme hledat minimum z neseřazené části. Analogicky opačně se tento princip může aplikovat pro sestupné řazení.
- Rozdělíme si posloupnost na seřazenou a neseřazenou část
- Najdeme prvek s nejmenší hodnotou v neseřazené části posloupnosti
- Zaměníme ho s prvkem na první pozici neseřazené části
- První prvek neseřazené části zahrneme do seřazené části a zároveň neseřazenou část zmenšíme o 1 prvek zleva
- Zbytek posloupnosti se uspořádá opakováním kroků 2 až 5 pro zbylou neseřazenou část
Nestabilita řazení
Algoritmus není stabilním (může změnit pořadí u prvků se shodným klíčem).
Je to dáno tím, že se prohazují nesousední prvky. Například pokud uvážíme množinu , tak nám ji algoritmus seřadí jako . Zde je jasně vidět, že algoritmus prohodil prvky a , což stabilní algoritmus řazení neudělá.
Řazení výběrem je možno implementovat i stabilně, pokud se místo záměny prvků použije přesunutí nalezeného nejmenšího prvku na příslušné místo, k tomu je ovšem potřeba použití datové struktury s rychlým vkládáním a odstraňováním, například spojový seznam, jinak výrazně zhorší výkonnost algoritmu.
Implementace algoritmu
Příklad v jazyce C:
void selectionSort(int data[], int count)
{
int i, j, mi, tmp;
for (i = 0; i < count - 1; i++) {
/* najdeme minimum */
mi = i;
for (j = i+1; j < count; j++) {
if (data[j] < data[mi]) {
mi = j;
}
}
/* vyměníme data[i] a data[mi] */
tmp = data[i];
data[i] = data[mi];
data[mi] = tmp;
}
}