Professional Documents
Culture Documents
Sortowanie Kubełkowe W Języku C++: Wprowadzenie Film Samouczek Przeczytaj Sprawdź Się Dla Nauczyciela
Sortowanie Kubełkowe W Języku C++: Wprowadzenie Film Samouczek Przeczytaj Sprawdź Się Dla Nauczyciela
Wprowadzenie
Film samouczek
Przeczytaj
Sprawdź się
Dla nauczyciela
Sortowanie kubełkowe w języku C++
Polecenie 1
Następnie ułóż je w losowej kolejności w jednej linii. Powstanie w ten sposób zbiór, który
posortujesz.
Następnie wybierz zbiór i zacznij układać jego elementy, jeden po drugim, w linii. Gdy dany
zbiór się skończy, wybierz następny i powtarzaj proces. Przedłużaj układaną linię aż do
momentu, gdy skończą się wszystkie zbiory.
Polecenie 3
Wyniki ankiety:
Raczej dobra – 18 %
Zdecydowanie dobra – 3 %
Specyfikacja problemu:
Dane:
dane – n-elementowa tablica zawierająca liczby naturalne z przedziału [0, 100]; tablica
liczb do posortowania
1 #include <iostream>
2
3 using namespace std;
4
5 int main () {
6
7 // Tutaj dodaj kod. Żeby coś wypisać, użyj polecenia: cout
8
9 return 0;
10
11 }
1
Polecenie 4
Polecenie 5
Dodaj do swojego programu komentarze tak, żeby był zrozumiały dla osoby, która nie potrafi
programować.
Przeczytaj
Sortowanie kubełkowe
Algorytm sortowania kubełkowego polega na zliczeniu wystąpień danych wartości w tablicy
wejściowej, a następnie na wygenerowaniu tablicy wyjściowej, zawierającej dane
w odpowiednich kubełkach, posortowane zgodnie z ich liczbą.
Specyfikacja problemu:
Dane:
Wynik:
Przykład 1
Na podstawie kilku zbiorów możemy sprawdzić, czy podany wzór na rozmiar tablicy jest
poprawny.
Dla zbioru:
5−0+1=6
Dla zbioru:
−1 − (−3) + 1 = 3
Ponownie otrzymaliśmy poprawną długość tablicy, która zgadza się z liczbą wymaganych
kubełków.
Dla zbioru:
2 − (−1) + 1 = 4
Po raz kolejny liczba wymaganych kubełków zgadza się z otrzymaną długością tablicy.
Przykład 2
Zbiór posiada elementy: {-5, 0, 2}, sprawdźmy, pod jakim indeksem będą one zliczane.
minLiczba = -5
maxLiczba = 2
k = 2 - (-5) + 1 = 8
tabZliczajaca[k] = {0, 0, 0, 0, 0, 0, 0, 0}
Indeks dla wartości 2 wynosi: 2 - (-5) = 7. Największa wartość będzie zliczana w komórce
o indeksie 7.
1 int tabPosortowana[n];
2 int j = 0;
3 for(int i = 0; i < k; i++)
4 {
5 while(tabZliczajaca[i] > 0)
6 {
7 tabPosortowana[j] = i + minLiczba;
8 tabZliczajaca[i]--;
9 j++;
10 }
11 }
Już wiesz
1 #include <iostream>
2 #include <climits>
3
4 using namespace std;
5
6 int main()
7 {
8 int tabWejsciowa[] = {3, 2, 3, 4, -4, 2, 3, 2, 0, -5};
9 int n = 10;
10
11 // znajdowanie wartości minimalnej i maksymalnej
12 int minLiczba = tabWejsciowa[0];
13 int maxLiczba = tabWejsciowa[0];
14
15 for(int i = 1; i < n; i++)
16 {
17 if(tabWejsciowa[i] < minLiczba)
18 minLiczba = tabWejsciowa[i];
19 else if(tabWejsciowa[i] > maxLiczba)
20 maxLiczba = tabWejsciowa[i];
21 }
22
23 // przygotowanie tablicy zliczającej
24 int k = maxLiczba - minLiczba + 1;
25 int tabZliczajaca[k] = {0};
26
27 // zliczanie wartości
28 for(int i = 0; i < n; i++)
29 {
30 int wartosc = tabWejsciowa[i];
31 tabZliczajaca[wartosc - minLiczba]++;
32 }
33
34 // porządkowanie
35 int tabPosortowana[n];
36 int j = 0;
37 for(int i = 0; i < k; i++)
38 {
39 while(tabZliczajaca[i] > 0)
40 {
41 tabPosortowana[j] = i + minLiczba;
42 tabZliczajaca[i]--;
43 j++;
44 }
45 }
46
47 // wypisanie uporządkowanych wartości
48 for(int i = 0; i<n; i++)
49 {
50 cout << tabPosortowana[i] << " ";
51 }
52
53 return 0;
54 }
Specyfikacja problemu:
Dane:
n – liczba naturalna; liczba elementów tablicy tabWejsciowa
tabWejsciowa – n‐elementowa tablica, przechowująca liczby rzeczywiste
Wynik:
W przypadku algorytmu dla liczb całkowitych każda liczba ma własny osobny kubełek, który
zawiera licznik jej wystąpień. Natomiast podczas sortowania liczb rzeczywistych kubełki są
przedziałami, do których trafiają liczby należące do danego przedziału. Przedziały mogą
być wyznaczane dowolnie, jednak wymaga to odpowiedniego dostosowania algorytmu.
1 #include <iostream>
2 #include <climits>
3 #include <vector>
4
5 using namespace std;
6
7 void wyswietlTablice(vector<float>* tab, int k) {
8 for (int i = 0; i < k; i++)
9 {
10 if (!tab[i].empty())
11 {
12 cout << "Kubełek numer " << i <<" : ";
13 for (int j = 0; j < (int)tab[i].size(); j++)
14 {
15 cout << tab[i].at(j) << "; ";
16 }
17 cout << endl;
18 }
19 }
20 cout << endl;
21 }
22
23 int main()
24 {
25 float tabWejsciowa[] = { 3.5, -4.2, 3.2, 4, -4, 2, 3.9, 2, 0,
26 int n = 10;
27
28 int minLiczba = tabWejsciowa[0];
29 int maxLiczba = tabWejsciowa[0];
30
31 for(int i = 1; i < n; i++)
32 {
33 if(tabWejsciowa[i] < minLiczba)
34 minLiczba = tabWejsciowa[i];
35 else if(tabWejsciowa[i] > maxLiczba)
36 maxLiczba = tabWejsciowa[i];
37 }
38
39 const int k = maxLiczba - minLiczba + 1;
40 vector<float> *tabZliczajaca = new vector<float>[k];
41
42 // zliczanie wartości
43 for (int i = 0; i < n; i++)
44 {
45 float wartosc = tabWejsciowa[i];
46 int indeksKubelka = (int)wartosc - (int)minLiczba;
47 tabZliczajaca[indeksKubelka].push_back(wartosc);
48 }
49
50 // wypisanie tabZliczajaca
51 wyswietlTablice(tabZliczajaca, k);
52
53 delete[] tabZliczajaca;
54 return 0;
55 }
Elementami tablicy zliczającej są tablice dynamiczne typu vector. Używamy takich tablic
jako kubełków, ponieważ nie wiemy, ile wartości do nich trafi. Tablice tego typu
umożliwiają zastosowanie wielu użytecznych metod ułatwiających dodawanie
i przeglądanie elementów.
Następnie indeks kubełka, do którego trafi liczba, wyznaczamy podobnie jak w przypadku
algorytmu dla liczb całkowitych:
indeksKubelka = (int)wartosc - (int)minLiczba.
1 int j = 0;
2 for (int i = 0; i < k; i++)
3 {
4 while (!tabZliczajaca[i].empty())
5 {
6 tabWejsciowa[j] = tabZliczajaca[i].back();
7 tabZliczajaca[i].pop_back();
8 j++;
9 }
10 }
Metoda back() pozwala na odczytanie ostatniego elementu tablicy typu vector, a metoda
pop_back() usuwa ostatni element takiej tablicy.
1 #include <iostream>
2 #include <climits>
3 #include <vector>
4
5 using namespace std;
6
7 void sortowanieBabelkowe(vector<float>& tab)
8 {
9 for (int j = tab.size() - 1; j > 0; j--)
10 for (int i = 0; i < j; i++) {
11 if (tab[i] < tab[i+1]) {
12 float tmp = tab[i];
13 tab[i] = tab[i+1];
14 tab[i+1] = tmp;
15 }
16 }
17 }
18
19 void wyswietlTablice(vector<float>* tab, int k) {
20 for (int i = 0; i < k; i++)
21 {
22 if (!tab[i].empty())
23 {
24 cout << "Kubełek numer " << i <<" : ";
25 for (int j = 0; j < (int)tab[i].size(); j++)
26 {
27 cout << tab[i].at(j) << "; ";
28 }
29 cout << endl;
30 }
31 }
32 cout << endl;
33 }
34
35 int main()
36 {
37 float tabWejsciowa[] = { 3.5, -4.2, 3.2, 4, -4, 2, 3.9, 2, 0,
38 int n = 10;
39
40 // znajdowanie wartości minimalnej i maksymalnej
41 int minLiczba = tabWejsciowa[0];
42 int maxLiczba = tabWejsciowa[0];
43
44 for(int i = 1; i < n; i++)
45 {
46 if(tabWejsciowa[i] < minLiczba)
47 minLiczba = tabWejsciowa[i];
48 else if(tabWejsciowa[i] > maxLiczba)
49 maxLiczba = tabWejsciowa[i];
50 }
51
52 const int k = maxLiczba - minLiczba + 1;
53 vector<float> *tabZliczajaca = new vector<float>[k];
54
55 // zliczanie wartości
56 for (int i = 0; i < n; i++)
57 {
58 float wartosc = tabWejsciowa[i];
59 int indeksKubelka = (int)wartosc - (int)minLiczba;
60 tabZliczajaca[indeksKubelka].push_back(wartosc);
61 }
62
63 // wypisanie tabZliczajaca
64 wyswietlTablice(tabZliczajaca, k);
65
66 // sortowanie kubełków
67 for (int i = 0; i < k; i++)
68 {
69 if (!tabZliczajaca[i].empty())
70 {
71 sortowanieBabelkowe(tabZliczajaca[i]);
72 }
73 }
74
75 // wypisanie tabZliczajaca
76 wyswietlTablice(tabZliczajaca, k);
77
78 // przepisanie elementów do tablicy wejściowej
79 int j = 0;
80 for (int i = 0; i < k; i++)
81 {
82 while (!tabZliczajaca[i].empty())
83 {
84 tabWejsciowa[j] = tabZliczajaca[i].back(); //odczytan
85 tabZliczajaca[i].pop_back(); //usunięcie ostatniego e
86 j++;
87 }
88 }
89
90 for (int i = 0; i < n; i++)
91 {
92 cout << tabWejsciowa[i] << " ";
93 }
94
95 delete[] tabZliczajaca;
96 return 0;
97 }
Słownik
indeks tablicy
numer, dzięki któremu możemy odnieść się do konkretnego elementu w tej tablicy
kubełek
Specyfikacja problemu:
Dane:
Wynik:
Twoje zadania
1. Dla podanych domyślnie danych wejściowych wypisz najmniejszą liczbę z tablicy.
2. Następnie wypisz największą liczbę z tablicy.
1 #include <iostream>
2 using namespace std;
3 int main() {
4 int n = 15;
5 int liczby[n] = { 3, 1, 0, 10, 6, 8, 4, 6, 2, 3, 0, 6, 6,
10, 6 };
6
7 //tu zapisz swój kod
8
9 return 0;
10 }
1
Ćwiczenie 2 醙
Napisz program, który dla zadanej tablicy zliczy wystąpienia każdego z elementów do
odpowiedniego kubełka. Wypisz zawartość każdego kubełka w następującej postaci:
indeks kubełka:zawartość kubełka, np. 0:2.
Specyfikacja problemu:
Dane:
Wynik:
Wskazówka:
Twoje zadania
1. Dla zadanej tablicy zlicz wystąpienia każdej z liczb, a następnie umieść ją w
odpowiednim kubełku. Wypisz zawartość kubełków zgodnie z następującym wzorem:
indeks kubełka:zawartość kubełka.
1 #include <iostream>
2
3 using namespace std;
4
5 int main() {
6 int n = 15;
7 int liczby[n] = { 3, 1, 0, 10, 6, 8, 4, 6, 2, 3, 0, 6, 6,
10, 6 };
8 int kubelki[n];
9
10 //tu napisz swój kod
11 return 0;
12 }
1
Ćwiczenie 3 難
Specyfikacja problemu:
Dane:
Wynik:
Przykładowe wyjście:
1 10
2 10
3 8
4 6
5 6
6 6
7 6
8 6
9 4
10 Liczba kubełków: 7
Twoje zadania
1. Posortuj daną tablicę nierosnąco i wypisz liczbę wykorzystanych kubełków. Liczba ta
musi być jak najmniejsza.
1 #include <iostream>
2 using namespace std;
3 int main() {
4 int n = 9;
5 int liczby[n] = { 10, 6, 8, 4, 6, 6, 6, 10, 6 };
6 //int kubelki[?];
7
8 //tu zapisz swój kod
9 return 0;
10 }
1
Dla nauczyciela
Grupa docelowa:
Podstawa programowa:
kompetencje cyfrowe;
kompetencje osobiste, społeczne i w zakresie umiejętności uczenia się;
kompetencje matematyczne oraz kompetencje w zakresie nauk przyrodniczych,
technologii i inżynierii.
Strategie nauczania:
konstruktywizm;
konektywizm.
dyskusja;
rozmowa nauczająca z wykorzystaniem multimedium i ćwiczeń interaktywnych;
ćwiczenia praktyczne.
Formy pracy:
praca indywidualna;
praca w parach;
praca w grupach;
praca całego zespołu klasowego.
Środki dydaktyczne:
Przebieg lekcji
Przed lekcją:
Faza realizacyjna:
Faza podsumowująca:
Praca domowa:
Materiały pomocnicze:
Wskazówki metodyczne: