You are on page 1of 4

Rikiavimas

Standartinė funkcija sort

http://www.cplusplus.com/reference/algorithm/sort/

http://www.cplusplus.com/reference/functional/greater/

Pavyzdžiai:
int n=5, A[5]={12, 15, 0, -2, 4};
sort(A, A+n); // išrikiuoja didėjančiai

sort(A, A+n, greater<int>()); // išrikiuoja mažėjančiai

sort(A, A+n, palyginimas); // išrikiuoja pagal palyginimo funkciją

Užduotis 1 parašykite programą, kuri duotus duomenis, n sveikųjų skaičių, surikiuotų standartine sort funkcija
mažėjančiai ir didėjančiai
Išrinkimo algoritmas (angl. selection sort) – vienas iš paprasčiausių rikiavimo algoritmų. Pagrindinis
principas – minimalų elementą reikia rašyti į pirmą duomenų sekos vietą, tada taikyti tą patį principą posekiui be
pirmojo elemento ir t. t.1

Tarkime turime tokią duomenų seką :

A[0] A[1] A[2] A[3] A[4]


10 12 3 -5 15

Pradėdami nuo nulinio ieškome mažiausio elemento sąraše ir randame, kad mažiausias elementas A[3] = -5,
tada jį sukeičiame su nuliniu swap(A[0], A[3]). Po sukeitimo mūsų sąrašas atrodys taip:

A[0] A[1] A[2] A[3] A[4]


-5 12 3 10 15

Paiešką tęsiame nuo pirmojo, nes nulinis jau savo vietoje. Randame, kad mažiausias elementas A[2] = 3,
jį sukeičiame su pirmuoju swap(A[1], A[2]). Po sukeitimo mūsų sąrašas atrodys taip:

A[0] A[1] A[2] A[3] A[4]


-5 3 12 10 15

Dabar savo vietoje jau du elementai. Paiešką kartojame n-1 kartą.

Sukeitimui mums reikia žinoti du indeksus: pirmasis bus išorinio ciklo indeksas, antrąjį reikia išsisaugoti.
Tai galima padaryti keliais būdais, pavyzdžiui:

int maz = i; int maz = A[i], maznr=i;


for (int j=i+1; j<n; j++) for (int j=i+1; j<n; j++)
{ {
if (A[maz] > A[j]) maz = j; if (maz > A[j])
} {
maz = A[j];
maznr = j;
}
}

Sukeitimas atliekamas taip:

swap (A[i], A[maz]); swap (A[i], A[maznr]);

1
https://lt.wikipedia.org/wiki/I%C5%A1rinkimo_rikiavimo_algoritmas
Visas išrinkimo algoritmas atrodytų taip:
for (int i=0; i<n-1; i++) for (int i=0; i<n-1; i++)
{ {
int maz = i; int maz = A[i], maznr=i;
for (int j=i+1; j<n; j++) for (int j=i+1; j<n; j++)
{ {
if (A[maz]>A[j]) if (maz > A[j])
maz = j; {
} maz = A[j];
swap (A[i], A[maz]); maznr = j;
} }
}
swap (A[i], A[maznr]);
}

Kadangi sprendžiam uždavinius ne visada reikia efektyvumo, tai rikiavimo algoritmą galima paprastinti taip:
kiekvieną kartą, kai einamas elementas mažesnis už į-tąjį, jį sukeisti:

for (int i=0;i<n-1;i++)


{
for (int j=i+1;j<n;j++)
{
if (A[i]>A[j])
swap(A[i], A[j]);
}
}

Vykdant pirmą kartą, kai i=0 ir j=1, apsikeitimai atrodys taip:


j = 1;
A[0] A[1] A[2] A[3] A[4]
10 12 3 -5 15
j = 2;
A[0] A[1] A[2] A[3] A[4]
3 12 10 -5 15
j = 3;
A[0] A[1] A[2] A[3] A[4]
-5 12 10 3 15
j = 4;
A[0] A[1] A[2] A[3] A[4]
-5 12 10 3 15

Vietoj vieno pakeitimo, programa jų darys daugiau, bet rezultate mažiausias elementas vis tiek atidurs nulinėje
pozicijoje ir veiksmus bus galima kartoti nuo pirmojo elemento.

Užduotis 2. Parašykite programą, kuri duotus duomenis, n sveikųjų skaičių, išrikiuotų Išrinkimo algoritmu
didėjančiai ir supaprastintu Išrinkimo algoritmu mažėjančiai.
Burbulo algoritmas (angl. bubble sort) - vienas iš paprastų, bet nelabai efektyvių rikiavimo
algoritmų. Algoritmo principas – nuosekliai iš eilės peržiūrėti gretimų elementų poras, prireikus elementus
sukeisti, perkeliant mažesnį arčiau pradžios.

Algoritmo vykdymas pažingsniui2


Naudosime skaičių masyvą „5 1 4 2 8“ ir jį surūšiuosime nuo mažiausio elemento iki didžiausio. Kiekviename
žingsnyje paryškinti elementai yra palyginami.
Pirmas praėjimas:
(5 1 4 2 8) -> (1 5 4 2 8) Čia algoritmas palygina pirmus 2 elementus ir juos apkeičia vietomis.
(1 5 4 2 8) -> (1 4 5 2 8)
(1 4 5 2 8) -> (1 4 2 5 8)
(1 4 2 5 8) -> (1 4 2 5 8) Dabar elementai yra išdėstyti tinkama tvarka, todėl algoritmas jų neapkeičia vietomis.

Antras praėjimas:
(1 4 2 5 8) -> (1 4 2 5 8)
(1 4 2 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
Dabar masyvo elementai išdėstyti tinkama tvarka, bet algoritmas to nežino. Algoritmui reikia vieno praėjimo
be pakeitimų, kad žinotų jog elementai reikiama tvarka.

Trečias praėjimas:
(1 2 4 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
(1 2 4 5 8) -> (1 2 4 5 8)
Galiausiai algoritmas baigė savo darbą.

Užduotis 3. Parašykite programą, kuri duotus duomenis, n sveikųjų skaičių, išrikiuotų Burbulo algoritmu
didėjančiai. Burbulo algoritmo interpretaciją pabandykite pasirašyti patys.

2
https://lt.wikipedia.org/wiki/Burbulo_rikiavimo_algoritmas

You might also like