Selection sort
Selection sort (řazení výběrem) je 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 Heapsort nebo Mergesort.
Algoritmus je univerzální (pracuje na základě porovnávání dvojic prvků), pracuje lokálně (nevyžaduje pomocnou paměť) a není stabilním (prvkům se stejným klíčem může změnit vzájemnou polohu)..
Obsah |
Princip [editovat]
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í [editovat]
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á.
Implementace algoritmu v jazyce C [editovat]
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; } }
Implementace algoritmu v jazyce Java [editovat]
public static void selectionSort1(int[] x) { for (int i=0; i<x.length-1; i++) { for (int j=i+1; j<x.length; j++) { if (x[i] > x[j]) { //... Exchange elements int temp = x[i]; x[i] = x[j]; x[j] = temp; } } } }