Gyors rendezés

Gyors rendezés

A gyors válogatás egy fejlett válogatási módszer, amely a csere elvén alapul. A buborék válogatás az összes közvetlen rendezési algoritmus leginkább hatékonysága. A javított algoritmus azonban a legelismertebb módszer a tömbök rendezéséhez. Olyan ragyogó tulajdonságokkal rendelkezik, mint Ch. Hoare feltalálója, hogy gyors válogatásnak nevezte.

A legnagyobb hatékonyság elérése érdekében nagy távolságra kell cserélni az elemeket. A tömbben egy elemet választanak ki, a megoldást. Aztán tedd a helyére a tömb, ahol lennie kellett volna rendezés utáni összes elem. A folyamat találni egy megfelelő helyet megoldására elem átrendezi az elemeket úgy, hogy az elemek maradt belőlük, kevesebb, mint a felbontás, és a jobb oldalon - kis (feltételezzük, hogy a tömb rendezése növekvő sorrendben).

Így a tömb két részre van osztva:

  • nem rendezett elemek a feloldó elem bal oldalán;
  • nem rendezett elemeket a feloldó elem jobb oldalán.

A két kisebb alárendszer rendezéséhez az algoritmus rekurzívan hívja magát.

Ha több elemet szeretne rendezni, akkor szüksége van rá

  • válasszuk ki a tömbben lévő felbontó elemet;
  • rendezze át a tömböt úgy, hogy az elemet a végső helyére helyezi;
  • rendezze az elemeket rekurzívan a felbontás bal oldalán;
  • rendezze az elemeket rekurzívan a megoldás jobb oldalára.

A gyors rendezés kulcseleme az átrendező algoritmus.

Vegyük fontolóra a tömb egy példájára való szétválogatást:

Az átrendező algoritmus végrehajtásához a bal mutatót a tömb bal szélső elemére használjuk. Az egérmutató jobbra mozog, amíg az elemek, amelyekre nézve, nem maradnak a permissíveknél. Index rendbe a jobb szélső elem a tömb, és balra mozog, amíg az elemeket, amelyek azt mutatja, tovább maradnak engedélyezve.

Hagyja, hogy a baloldali elem legyen a megoldás. Állítsa a bal oldali mutatót a következő elemre; jobbra - az utolsóig. Az algoritmusnak meg kell határoznia a 10 elem helyes helyzetét, és az anyag során helytelenül helyezett elemeket kell kicserélnie.

A mutatók mozgása megáll, amint olyan elemek vannak, amelyek rendezési sorrendje a felbontóelemhez képest helytelen.

A bal mutató mindaddig mozog, amíg 10-nél nagyobb elemet nem mutat; jobbra mozog, amíg 10-nél kisebb elemet mutat.


Ezek az elemek megváltoztatják a helyeket, és a mutatók mozgása folytatódik.


A folyamat addig folytatódik, amíg a jobb oldalon a bal oldalon balra esik.


Ez meghatározza a felbontó elem helyes elhelyezkedését.

A permutációs elem átrendeződik a jobbra mutató elemgel.

A felbontó elem a megfelelő helyen van: a bal oldali elemek kisebb értékekkel rendelkeznek; a jobb oldalon - nagy. Az algoritmust rekurzív módon a rendező bal oldalára és annak jobb oldalára rendezzük.

Az algoritmus végrehajtása gyors válogatásra a C-n

#include
#include
// Gyors rendezési funkció
void quickSort (int * számok, int left, int right)
int pivot; // megoldó elem
int l_hold = bal; // bal szél
int r_hold = jobb; // jobb szél
pivot = számok [left];
míg (balra míg ((számok [jobb]> = pivot) (bal right--; / / a jobb szélességet eltolja, miközben a [jobb] elem nagyobb, mint a [pivot]
ha (balra = jobbra) // ha a határok nem záródnak le
számok [left] = számok [right]; // mozgassa a [jobb] elemet a permissívbe
balra ++; // tolja jobbra a bal oldali szegélyt
>
míg a ((számok [balra] <= pivot) && (left balra ++; // tolja a bal oldali szegélyt, miközben a [bal] elem kisebb [pivot]
ha (balra = jobbra) // ha a határok nem záródnak le
<
számok [jobb] = számok [balra]; // mozgassa a [bal oldali] elemet a helyre [jobbra]
right--; // tolja jobbra a jobb oldalt
>
>
számok [left] = pivot; // helyezze a felbontó elemet a helyére
pivot = bal;
bal = l_hold;
jobb = r_hold;
ha (balra quickSort (számok, bal, pivot - 1);
ha (jobb> pivot)
quickSort (számok, pivot + 1, jobb);
>
int main ()
int a [10];
// Töltse ki a tömböt véletlen számokkal
az (int i = 0; i<10; i++)
a [i] = rand ()% 20 - 10;
// Megjeleníti a tömbelemeket a rendezés előtt
az (int i = 0; i<10; i++)
printf ("." a [i]);
printf ("\ n");
quickSort (a, 0, 9); // hívja a rendezési funkciót
// A tömbelemek kimenete a rendezés után
az (int i = 0; i<10; i++)
printf ("." a [i]);
printf ("\ n");
getchar ();
visszatérés 0;
>

Kapcsolódó cikkek