QuickSelect: Gyorsválasztási algoritmus, kódmintákkal magyarázva

Mi a QuickSelect?

A QuickSelect egy választási algoritmus a K-edik legkisebb elem megkeresésére egy nem rendezett listában.

Az algoritmus magyarázata

Miután megtalálta a pivot (egy olyan pozíció, amely két részre osztja a listát: a bal oldalon minden elem kevesebb, mint a pivot, a jobb oldalon pedig minden elem nagyobb, mint a pivot), az algoritmus csak annak a résznek felel meg, amely tartalmazza a k-t legkisebb elem.

Ha a particionált elem (pivot) indexe nagyobb, mint k, akkor az algoritmus megismétlődik a bal résznél. Ha az index (pivot) megegyezik k-vel, akkor megtaláltuk a k-edik legkisebb elemet, és visszaadjuk. Ha az index kisebb, mint k, akkor az algoritmus a jobb résznél megismétlődik.

Válogatás Psudocode

Input : List, left is first position of list, right is last position of list and k is k-th smallest element. Output : A new list is partitioned. quickSelect(list, left, right, k) if left = right return list[left] // Select a pivotIndex between left and right pivotIndex := partition(list, left, right, pivotIndex) if k = pivotIndex return list[k] else if k < pivotIndex right := pivotIndex - 1 else left := pivotIndex + 1 

Partíció

A partíciónak meg kell találnia a forgásirányt a fentiek szerint. (A bal oldalon minden elem kevesebb, mint a pivot, és a jobb oldalon minden elem több, mint a pivot) A partíció pivotjának megtalálásához két algoritmus létezik.

  • Lomuto partíció
  • Hoare partíció

Lomuto partíció

Ez a partíció olyan pivot választ, amely általában a tömb utolsó eleme. Az algoritmus fenntartja az i indexet, miközben egy másik j index segítségével beolvassa a tömböt, így a lo-i (beleértve) elemek kisebbek vagy egyenlőek a forgási ponttal, és az i + 1 - j-1 (beleértve) elemek nagyobbak, mint a forgatható.

Ez a séma akkor degradálódik, O(n^2)amikor a tömb már rendben van.

algorithm Lomuto(A, lo, hi) is pivot := A[hi] i := lo for j := lo to hi - 1 do if A[j] < pivot then if i != j then swap A[i] with A[j] i := i + 1 swap A[i] with A[hi] return i 

Hoare partíció

Hoare két indexet használ, amelyek a particionálandó tömb végéből indulnak, majd egymás felé mozognak, amíg észlelnek egy inverziót: egy pár elemet, amelyek egyek vagy nagyobbak a forgáspontnál, egyek kisebbek vagy egyenlőek a forgáspontoknál, amelyek rossz sorrendben vannak egymáshoz képest.

Ezután a megfordított elemeket felcseréljük. Amikor az indexek találkoznak, az algoritmus leáll és visszaadja a végső indexet. Ennek az algoritmusnak számos változata létezik.

algorithm Hoare(A, lo, hi) is pivot := A[lo] i := lo - 1 j := hi + 1 loop forever do i := i + 1 while A[i]  pivot if i >= j then return j swap A[i] with A[j]