Serwis Edukacyjny w I-LO w Tarnowie Materiały dla uczniów liceum |
Wyjście Spis treści Wstecz Dalej
Autor artykułu: mgr Jerzy Wałaszek |
©2024 mgr Jerzy Wałaszek |
SPIS TREŚCI |
Sortowanie danych
(ang. data sort) jest jednym z podstawowych problemów
programowania komputerów, z którym prędzej czy później spotka
się każdy programista. Poniżej przedstawiamy tylko nieliczne
dziedziny, w których występuje potrzeba sortowania danych:
|
Zbiór uporządkowany (ang. ordered set) to taki, w którym elementy występują w określonym porządku, czyli w określonej kolejności kolejności. Jeśli elementy są liczbami, to porządek może być:
Przez sortowanie będziemy rozumieć taką zmianę kolejności elementów zbioru nieuporządkowanego (permutację), aby w wyniku spełniały one założony porządek.
Algorytm sortowania bąbelkowego jest jednym z
najstarszych algorytmów sortujących. Zasada działania opiera się na cyklicznym porównywaniu par
sąsiadujących elementów i
zamianie ich kolejności w przypadku niespełnienia
kryterium porządkowego zbioru. Operację tę wykonujemy dotąd, aż cały zbiór
zostanie posortowany.
Jako przykład działania algorytmu sortowania bąbelkowego posortujemy przy
jego pomocy
Posortowanie naszego zbioru wymaga 4 obiegów. Jest to oczywiste: w przypadku
najbardziej niekorzystnym najmniejszy element znajduje się na samym końcu zbioru
wejściowego. Każdy obieg przesuwa go o jedną pozycję w kierunku początku zbioru.
Takich przesunięć należy wykonać
Uwaga:Algorytm sortowania bąbelkowego jest uważany za
bardzo zły algorytm sortujący. Można go stosować tylko dla
niewielkiej liczby elementów w sortowanym zbiorze
(do około 5000). Przy większych zbiorach czas sortowania może
być zbyt długi. Obecnie algorytm ten ma tylko znaczenie dydaktyczne,
ponieważ opracowano bardziej efektywne algorytmy sortowania. |
n | - liczba elementów w sortowanej tablicy, n ∈ N |
t[ ] | - tablica n-elementowa, która będzie sortowana. Elementy tablicy mają indeksy od 0 do n - 1. |
t[ ] | - posortowana tablica n-elementowa. Elementy tablicy mają indeksy od 0 do n - 1. |
i, j | - zmienne sterujące pętli, i, j ∈ N |
x | - zmienna wykorzystywana do zamiany miejscami elementów tablicy |
K01: | Dla j = 0,1,...,n - 2: Wykonuj krok K02 |
K02: | Dla i = 0,1,...,n -
2: Jeśli t[ i ] > t[ i + 1 ], to x ← t[ i ], t[ i ] ← t[ i + 1 ], t[ i + 1 ] ← x |
K03: | Zakończ |
Sortowanie wykonywane jest w dwóch zagnieżdżonych pętlach. Pętla zewnętrzna
nr 1 kontrolowana jest przez
obiegów pętli wewnętrznej, po których zakończeniu zbiór zostanie posortowany. Liczba obiegów jest proporcjonalna kwadratowo do liczby elementów sortowanej tablicy. Ponieważ wykonanie obiegu zajmuje pewien czas, to całkowity czas pracy algorytmu jest proporcjonalny do kwadratu liczby sortowanych elementów. Jeśli liczbę elementów zwiększymy dwa razy, to czas ich posortowania algorytmem bąbelkowym wzrośnie średnio cztery razy. Przy dużej liczbie elementów czas ten może być bardzo długi.
Sortowanie odbywa się wewnątrz pętli nr 2. Kolejno porównywany jest
Dane dla programu:
Wszystkie liczby do posortowania są całkowite i są z zakresu od 0 do 999. Pierwsza liczba określa ilość liczb, które wystąpią za nią.
100 41 467 334 500 169 724 478 358 962 464 705 145 281 827 961 491 995 942 827 436 391 604 902 153 292 382 421 716 718 895 447 726 771 538 869 912 667 299 35 894 703 811 322 333 673 664 141 711 253 868 547 644 662 757 37 859 723 741 529 778 316 35 190 842 288 106 40 942 264 648 446 805 890 729 370 350 6 101 393 548 629 623 84 954 756 840 966 376 931 308 944 439 626 323 537 538 118 82 929 541
// Sortowanie bąbelkowe //---------------------- #include <iostream> #include <iomanip> using namespace std; int main() { // Odczytujemy ilość liczbę danych do zmiennej n int n; cin >> n; // Tworzymy tablicę n elementową na liczby do sortowania int t[n], i, j, x; // Odczytujemy dane do tablicy for(i = 0; i < n; i++) cin >> t[i]; // Wyświetlamy tablicę nieposortowaną cout << endl << "PRZED SORTOWANIEM:" << endl; for(i = 0; i < n; i++) cout << setw(4) << t[i]; cout << endl; // Sortujemy bąbelkowo for(j = 0; j < n - 1; j++) for(i = 0; i < n - 1; i++) if(t[i] > t[i+1]) { x = t[i]; t[i] = t[i+1]; t[i+1]= x; } // Wyświetlamy tablicę posortowaną cout << endl << "PO SORTOWANIU:" << endl; for(i = 0; i < n; i++) cout << setw(4) << t[i]; cout << endl << endl; return 0; } |
Idea algorytmu sortowania przez wybór jest bardzo prosta. Załóżmy, iż chcemy posortować zbiór liczbowy rosnąco. Zatem element najmniejszy powinien znaleźć się na pierwszej pozycji. Szukamy w zbiorze elementu najmniejszego i wymieniamy go z elementem na pierwszej pozycji. W ten sposób element najmniejszy znajdzie się na swojej docelowej pozycji.
W identyczny sposób postępujemy z resztą elementów należących do zbioru. Znów
wyszukujemy element najmniejszy i zamieniamy go z elementem na drugiej pozycji.
Otrzymamy dwa posortowane elementy. Procedurę kontynuujemy dla pozostałych
elementów dotąd, aż wszystkie będą posortowane.
Przykład:
Dla przykładu posortujmy tą metodą zbiór {4 7 2 9 3}. Kolorem zielonym oznaczyliśmy elementy zbioru, które są już posortowane.
Zbiór | Opis operacji |
4 7 2 9 3 |
Wyszukujemy najmniejszy element w zbiorze. Jest nim liczba 2. |
2 7 4 9 3 |
Znaleziony element minimalny wymieniamy z pierwszym elementem zbioru - liczbą 4 |
2 7 4 9 3 |
Wśród pozostałych elementów wyszukujemy element najmniejszy. Jest nim liczba 3. |
2 3 4 9 7 |
Znaleziony element minimalny wymieniamy z drugim elementem zbioru - liczbą 7. |
2 3 4 9 7 |
Znajdujemy kolejny element minimalny - liczbę 4. |
2 3 4 9 7 |
Wymieniamy go z samym sobą - element ten nie zmienia zatem swojej pozycji w zbiorze. |
2 3 4 9 7 |
Znajdujemy kolejny element minimalny |
2 3 4 7 9 |
Wymieniamy go z liczbą 9 |
2 3 4 7 9 |
Ostatni element jest zawsze na właściwej pozycji. Sortowanie zakończone |
Podana metoda sortuje zbiór rosnąco. Jeśli chcemy posortować zbiór malejąco, to zamiast elementu minimalnego poszukujemy elementu maksymalnego. Pozostała część procedury sortującej nie ulega zmianie.
n | - liczba elementów w sortowanym zbiorze, n ∈ C |
t[ ] | - zbiór n-elementowy, który będzie sortowany. Elementy zbioru mają indeksy od 0 do n-1. |
t[ ] | - posortowany zbiór n-elementowy. Elementy zbioru mają indeksy od 0 do n-1. |
i, j | - zmienne sterujące pętli, i, j ∈ C |
pmin | - pozycja elementu minimalnego w zbiorze d[ ], pmin ∈ C |
K01: | Dla j = 0, 1, ..., n - 2: wykonuj kroki K02...K04 |
K02: | pmin ← j |
K03: | Dla i = j + 1, j
+ 2, ...,
n - 1: jeśli d[i] < d[pmin], to pmin ← i |
K04: | d[j] ↔ d[pmin] |
K05: | Zakończ |
Pętla zewnętrzna sterowana zmienną j wyznacza kolejne
elementy zbioru o indeksach od
0 do
W pętli numer 2 sterowanej zmienną i porównujemy
pozostałe elementy zbioru z elementem
Po zakończeniu pętli wewnętrznej pmin
zawiera indeks elementu minimalnego. Zamieniamy miejscami element
d[j]
z elementem
Na lekcji napiszemy program.
Dane dla programu:
100 41 467 334 500 169 724 478 358 962 464 705 145 281 827 961 491 995 942 827 436 391 604 902 153 292 382 421 716 718 895 447 726 771 538 869 912 667 299 35 894 703 811 322 333 673 664 141 711 253 868 547 644 662 757 37 859 723 741 529 778 316 35 190 842 288 106 40 942 264 648 446 805 890 729 370 350 6 101 393 548 629 623 84 954 756 840 966 376 931 308 944 439 626 323 537 538 118 82 929 541
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2024 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.