# Vienmačiai masyvai: rikiavimas
# Vaizdo pamoka
1 dalis:
2 dalis:
# Algoritmų veikimo vizualizacijos
Šių algoritmų vizualizacijų galima rasti čia (opens new window).
# Rikiavimas Burbuliuko metodu (angl. Bubble sort)
# Pavyzdys 1
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
for (int i = 0; i < kiekis - 1; i++)
{
for (int j = 0; j < kiekis - i - 1; j++)
{
// Tikrinimas ar reikia apkeisti
// Ženklas gali būti ir į kitą pusę, jei reikia pakeisti rikiavimo pusę
if (skaiciai[j] > skaiciai[j + 1])
{
// Skaičių apkeitimas vietomis
// temp turi būti to paties tipo kaip masyvo narių tipas
int temp = skaiciai[j];
skaiciai[j] = skaiciai[j + 1];
skaiciai[j + 1] = temp;
}
}
}
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
15 23 28 35 47 49 125 254 354
# Pavyzdys 2
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
bool rikiuoti = true;
while (rikiuoti)
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
// Tikrinimas ar reikia apkeisti
// Ženklas gali būti ir į kitą pusę, jei reikia pakeisti rikiavimo pusę
if (skaiciai[i] > skaiciai[i + 1])
{
// Skaičių apkeitimas vietomis
swap(skaiciai[i], skaiciai[i + 1]);
rikiuoti = true;
}
}
}
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
15 23 28 35 47 49 125 254 354
# Pavyzdys 3
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
bool rikiuoti;
do
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
// Tikrinimas ar reikia apkeisti
// Ženklas gali būti ir į kitą pusę, jei reikia pakeisti rikiavimo pusę
if (skaiciai[i] > skaiciai[i + 1])
{
// Skaičių apkeitimas vietomis
swap(skaiciai[i], skaiciai[i + 1]);
rikiuoti = true;
}
}
} while (rikiuoti);
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
15 23 28 35 47 49 125 254 354
# Pavyzdys 4
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
string zodziai[] = { "Jonas", "Petras", "Gintas", "Adomas", "Povilas",
"Gabriele", "Gintare", "Julija", "Ona" };
int kiekis = 8;
// Žodžių išvedimas
cout << "Zodziai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << zodziai[i] << " ";
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
bool rikiuoti;
do
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
// Tikrinimas ar reikia apkeisti
// Ženklas gali būti ir į kitą pusę, jei reikia pakeisti rikiavimo pusę
if (zodziai[i] > zodziai[i + 1])
{
// Žodžių apkeitimas vietomis
swap(zodziai[i], zodziai[i + 1]);
rikiuoti = true;
}
}
} while (rikiuoti);
// Surikiuotų žodžių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << zodziai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Zodziai:
Jonas Petras Gintas Adomas Povilas Gabriele Gintare Julija
Surikiuoti:
Adomas Gabriele Gintare Gintas Jonas Julija Petras Povilas
# Pavyzdys 5
Kodas:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
// Pradiniai duomenys
string vardai[] = { "Jonas", "Petras", "Inga", "Elina" };
int amziai[] = { 58, 30, 35, 32 };
int kiekis = 4;
// Duomenų išvedimas
cout << "Vardas ir amzius\n\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(10) << left << vardai[i] << " " << amziai[i] << endl;
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
bool rikiuoti;
do
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
// Tikrinimas ar reikia apkeisti
// Ženklas gali būti ir į kitą pusę, jei reikia pakeisti rikiavimo pusę
if (amziai[i] > amziai[i + 1])
{
// Apkeitimas vietomis, ne tik amžiai bet ir vardai
swap(amziai[i], amziai[i + 1]);
swap(vardai[i], vardai[i + 1]);
rikiuoti = true;
}
}
} while (rikiuoti);
// Surikiuotų duomenų išvedimas
cout << "Surikiuoti\n";
cout << "Vardas ir amzius\n\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(10) << left << vardai[i] << " " << amziai[i] << endl;
}
cout << endl;
return 0;
}
Rezultatai:
Vardas ir amzius
Jonas 58
Petras 30
Inga 35
Elina 32
Surikiuoti
Vardas ir amzius
Petras 30
Elina 32
Inga 35
Jonas 58
# Pavyzdys 6
Kodas:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
// Pradiniai duomenys
string vardai[] = { "Jonas", "Petras", "Inga", "Aina" };
int amziai[] = { 58, 30, 35, 30 };
int kiekis = 4;
// Duomenų išvedimas
cout << "Vardas ir amzius\n\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(10) << left << vardai[i] << " " << amziai[i] << endl;
}
cout << endl;
// Rikiavimas burbuliuko metodu (bubble sort)
bool rikiuoti;
do
{
rikiuoti = false;
for (int i = 0; i < kiekis - 1; i++)
{
// Pagal amžių didėjimo tvarka,
// o jei amžius sutampa tai pagal vardą abėcėliškai
if (amziai[i] > amziai[i + 1] ||
(amziai[i] == amziai[i + 1] && vardai[i] > vardai[i + 1]))
{
// Apkeitimas vietomis, ne tik amžiai bet ir vardai
swap(amziai[i], amziai[i + 1]);
swap(vardai[i], vardai[i + 1]);
rikiuoti = true;
}
}
} while (rikiuoti);
// Surikiuotų duomenų išvedimas
cout << "Surikiuoti\n";
cout << "Vardas ir amzius\n\n";
for (int i = 0; i < kiekis; i++)
{
cout << setw(10) << left << vardai[i] << " " << amziai[i] << endl;
}
cout << endl;
return 0;
}
Rezultatai:
Vardas ir amzius
Jonas 58
Petras 30
Inga 35
Aina 30
Surikiuoti
Vardas ir amzius
Aina 30
Petras 30
Inga 35
Jonas 58
# Rikiavimas Įterpimo metodu (angl. Insertion sort)
# Pavyzdys 1
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas įterpimo metodu (insertion sort)
int j;
for (int i = 1; i < kiekis; i++)
{
j = i;
// Norint apkeisti rikiavimo pusę, prie skaičių
// skaiciai[j] < skaiciai[j - 1]
// galima keisti ženklą į kitą pusę
while (j > 0 && skaiciai[j] < skaiciai[j - 1])
{
// Skaičių apkeitimas
swap(skaiciai[j], skaiciai[j - 1]);
j--;
}
}
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
15 23 28 35 47 49 125 254 354
# Pavyzdys 2
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas įterpimo metodu (insertion sort)
int j;
for (int i = 1; i < kiekis; i++)
{
j = i;
// Norint apkeisti rikiavimo pusę, prie skaičių
// skaiciai[j] > skaiciai[j - 1]
// galima keisti ženklą į kitą pusę
while (j > 0 && skaiciai[j] > skaiciai[j - 1])
{
// Skaičių apkeitimas
int temp = skaiciai[j];
skaiciai[j] = skaiciai[j - 1];
skaiciai[j - 1] = temp;
j--;
}
}
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
354 254 125 49 47 35 28 23 15
# Rikiavimas Gnomo metodu (angl. Gnome sort)
# Pavyzdys
Kodas:
#include <iostream>
using namespace std;
int main()
{
// Pradiniai duomenys
int skaiciai[] = { 47, 125, 23, 35, 49, 254, 354, 15, 28 };
int kiekis = 9;
// Skaičių išvedimas
cout << "Skaiciai:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
// Rikiavimas gnomo metodu (gnome sort)
for (int i = 0; i < kiekis - 1; i++)
{
// Jei reikia rikiavimo į kitą pusę, čia galime pakeisti ženklą
if (skaiciai[i] > skaiciai[i + 1])
{
// Skaičių apkeitimas
swap(skaiciai[i], skaiciai[i + 1]);
if (i > 0)
{
i -= 2; // atgal du žingsnius
}
}
}
// Surikiuotų skaičių išvedimas
cout << "\nSurikiuoti:\n";
for (int i = 0; i < kiekis; i++)
{
cout << skaiciai[i] << " ";
}
cout << endl;
return 0;
}
Rezultatai:
Skaiciai:
47 125 23 35 49 254 354 15 28
Surikiuoti:
15 23 28 35 47 49 125 254 354
# Užduotys
# Užduotis 1
- Leiskite vartotojui suvesti norimą kiekį skaičių.
- Surikiuokite skaičius mažėjimo tvarka.
- Atvaizduokite tris didžiausius skaičius.
# Užduotis 2
- Leiskite vartotojui suvesti norimą kiekį skaičių.
- Atrinkite visus lyginius skaičius, bei visus nelyginius skaičius į atskirus masyvus.
- Vieną iš atrinktų masyvų surikiuokite didėjimo tvarka, kitą mažėjimo.
- Išveskite pradinius duomenis ir atrinktus bei surikiuotus duomenis.
# Užduotis 3
- Turite dienų temperatūrų informaciją.
- Į vieną masyvą atrinkite aukštas temperatūras (kurios didesnės nei 20 laipsnių), o į kitą žemas (mažesnės nei 10 laipsnių).
- Aukštas temperatūras surikiuokite mažėjimo tvarka.
- Žemas temperatūras surikiuokite didėjimo tvarka.
- Išveskite pradines temperatūras, atrinktas temperatūras ir po top 3 temperatūras, t.y. tris didžiausias ir tris mažiausias.
# Užduotis 4
- Sugeneruokite 20 atsitiktinių skaičių, kur kiekvienas skaičius patenka į rėžius
[1-100]
. - Atrinkite skaičius, didesnius nei sugeneruotų skaičių vidurkis.
- Surikiuokite atrinktus skaičius didėjimo tvarka.
- Išveskite pradinius skaičius, bei atrinkus ir surikiuotus skaičius.
# Užduotis 5
- Turite informaciją apie krepšininko pelnytus taškus per įvairas varžybas.
- Raskite 5 didžiausius rezultatus (turbūt būtų patogu pirma surikiuoti ir tada gauti kelis reikiamus skaičius).
- Raskite šių 5-ių didžiausių rezultatų vidurkį.
# Užduotis 6
- Turite informaciją apie prekes (pavadinimas, kiekis, vieneto kaina).
- Išveskite šią informaciją lentelės pavidalu.
- Surikiuokite prekes pagal kainą, mažėjimo tvarka, o jei kaina sutampa tuomet pagal pavadinimą didėjimo tvarka. Nepamirškite perkelti ir kitų stulpelių. Surikiuotus rezultatus išveskite lentelės pavidalu.