Metodyki i Techniki Programowania 2 zajęcia nr 5 algorytmy cz.1: sortowanie Elektronika i Telekomunikacja, semestr III rok akademicki 2009/2010 mgr inż.. Paweł Myszkowski Plan dzisiejszych zajęć 1. Sortowanie elementów w tablicy - idea 2. Sortowanie bąbelkoweb belkowe 3. Sortowanie przez wstawianie 4. Sortowanie przez wybór 5. Szybkie sortowanie, czyli quicksort 6. Zadanie do zrobienia 1
1. Sortowanie - idea Sortowanie - porządkowanie elementów tablicy; takie jej przekształcenie, aby elementy układa adały y się w zależno ności od potrzeb rosnąco lub malejąco. 1 3 5 6 9 9 5 6 3 1 lub 9 6 5 3 1 2. Sortowanie bąbelkoweb belkowe W każdym obiegu pętli p wewnętrznej przebiegamy przez całą tablicę,, porównuj wnując c każdy element z jego sąsiadem siadem z prawej strony, Jeżeli eli badane dwa elementy nie zachowują określonego porządku, zamieniamy je miejscami, Pętla zewnętrzna wykonuje się tak długo, d jak długo d w pętli p wewnętrznej zajdzie przynajmniej jedna zamiana. Nazwa pochodzi od faktu, że e skrajne elementy wędrują kolejno na koniec tablicy jak pęcherzyki p powietrza unoszące się w wodzie. 2
2. Sortowanie bąbelkoweb belkowe Przykład: sortujemy rosnąco zbiór r 9 5 6 3 1 W celu posortowania całego zbioru należy y wykonać 5 obiegów porządkuj dkujących, w których 20 razy porównuje się elementy i dokonuje 9 zamian. 2. Sortowanie bąbelkoweb belkowe Algorytm sortowania bąbelkowego: b belkowego: 1. Jeśli liczba elementów w w zbiorze jest mniejsza od 2, kończymy algorytm. 2. Rozpoczynamy od pierwszego elementu. 3. Bieżą żący element porównujemy z elementem bezpośrednio następnym w zbiorze.. Jeśli kolejność elementów w jest zła, z to zamieniamy je miejscami. 4. Jeśli bieżą żący element nie jest przedostatnim elementem zbioru, to przesuwamy się do kolejnego elementu i wracamy do punktu 3. 5. Jeśli w trakcie przeglądania zbioru dokonaliśmy zamiany miejsc elementów, wracamy się do punktu 2. 6. Koniec. 3
2. Sortowanie bąbelkoweb belkowe Schemat blokowy opisujący algorytm 3. Sortowanie przez wstawianie Algorytm szybszy i bardziej efektywny niż sortowanie bąbelkowe, b belkowe, Koncepcyjnie jednak bardziej złożony, z ony, Przypomina układanie w ręku r kart dobieranych z talii podczas rozgrywki np.. w brydża a lub pokera. 4
3. Sortowanie przez wstawianie Przykład: sortujemy rosnąco zbiór r 9 5 6 3 1 4 obiegi 10 porówna wnań 9 przesunięć 3. Sortowanie przez wstawianie Algorytm sortowania przez wstawianie: 1. Jeśli zbiór r zawiera mniej niż dwa elementy, to kończymy. 2. Na końcu zbioru tworzymy listę uporządkowanych elementów. Początkowo lista ta obejmuje jeden, ostatni element. 3. Sortowanie rozpoczynamy od elementu leżą żącego w zbiorze tuż przed listą uporządkowan dkowaną.. Element wyciągamy ze zbioru. Miejsce zajmowane przez niego staje się wolne. 4. Wyciągni gnięty element porównujemy kolejno z elementami na liście uporządkowanej. Jeśli element listy jest mniejszy (ze względu na porządek wyznaczony przez funkcję porównuj wnującą) ) od elementu wyciągni gniętego, to przesuwamy go na wolne miejsce. Operację tą powtarzamy dotąd, d, aża napotkamy koniec listy lub element większy lub równy r elementowi wyciągni gniętemu. 5. Element wyciągni gnięty wstawiamy na wolne miejsce. Rozmiar listy uporządkowanej rośnie o 1 element. 6. Jeśli lista uporządkowana nie obejmuje jeszcze całego zbioru, to przechodzimy do punktu 2. 7. W przeciwnym wypadku kończymy algorytm. 5
3. Sortowanie przez wstawianie Schemat blokowy opisujący algorytm 4. Sortowanie przez wybór Algorytm sortowania przez wybór: 1. Jeśli zbiór r liczy mniej niż dwa elementy, to kończymy. 2. W zbiorze wyszukujemy najmniejszy/największy element. 3. Najmniejszy element zamieniamy miejscami z pierwszym elementem zbioru. 4. Za nowy zbiór r przyjmujemy zbiór r bez pierwszego elementu, gdyż ten jest już na prawidłowym miejscu. Powracamy do punktu 1. 6
4. Sortowanie przez wybór Przykład: sortujemy rosnąco zbiór r 9 5 6 3 1 4. Sortowanie przez wybór Wyszukiwanie najmniejszego elementu: 1. Tymczasowy najmniejszy (największy) element przyjmujemy pierwszy element zbioru. 2. Jeśli zbiór r ma mniej niż dwa elementy, kończymy. 3. Za pomocą funkcji porównuj wnującej sprawdzamy kolejno element tymczasowy z pozostałymi elementami zbioru. Jeśli w wyniku porównania elementu tymczasowego z elementem zbioru funkcja porównuj wnująca da wynik false (dla elementu największego da wynik true), to za nowy element najmniejszy (największy) przyjmujemy dany element zbioru i kontynuujemy przeglądanie. 7
4. Sortowanie przez wybór Przykład: Znaleźć najmniejszy element w zbiorze 4 7 3 2 5 1 4. Sortowanie przez wybór Schemat blokowy opisujący algorytm 8
5. Szybkie sortowanie - quicksort Algorytm opracowany przez Hoare'a, Szybki, szczególnie do sortowania dużych tablic, Prosty w implementacji, Opiera się na technice "dziel i zwycięż ężaj" (divide( and conquer), Tablica (po pewnej obróbce) bce) dzielona jest na dwie mniejsze, następnie każda z tablic składowych znów jest dzielona i tak się to odbywa aża do uzyskania zbiorów w jednoelementowych. 5. Szybkie sortowanie - quicksort Sortujemy rosnąco tablicę: 5 7 8 1 4 0 4 6 8 2 1 5 2 6 9 Punkt odniesienia pierwsza liczba z tablicy, czyli 5. Przeglądaj dając c od lewej, szukamy elementu większego (tu: 7), a od prawej mniejszego (tu: 2): 5 7 8 1 4 0 4 6 8 2 1 5 2 6 9 Zamieniamy ze sobą podkreślone elementy. Kontynuujemy przeszukiwanie: 5 2 8 1 4 0 4 6 8 2 1 5 7 6 9 Zamieniamy podkreślone elementy: 5 2 1 1 4 0 4 6 8 2 8 5 7 6 9 Dochodzimy ostatecznie do postaci: 5 2 1 1 4 0 4 2 8 6 8 5 7 6 9 9
5. Szybkie sortowanie - quicksort 5 2 1 1 4 0 4 2 8 6 8 5 7 6 9 Idąc c od lewej zatrzymujemy się na 8, a od prawej na 2, czyli nasze poszukiwania "skrzyżowa owały y się". Cofamy się z każdej strony o krok i dzielimy tablicę: 5 2 1 1 4 0 4 2 8 6 8 5 7 6 9 Z obiema tablicami postępujemy pujemy tak samo jak z tablicą wejściow ciową.. Kolejne podziały y wyglądaj dają następuj pująco: 2 2 1 1 4 0 4 5 6 6 7 5 8 8 9 0 1 1 2 4 2 4 5 5 6 7 6 8 8 9 0 11 2 424 5 5 6 76 8 8 9 0 1 1 2 2 44 5 5 6 6 7 8 8 9 0 1 1 2 2 4 4 5 5 6 6 7 8 8 9 Łączymy całość otrzymując: 0 1 1 2 2 4 4 5 5 6 6 7 8 8 9 5. Szybkie sortowanie - quicksort Uwaga: Quicksort działa a wolniej wyłą łącznie w przypadku tablicy ułożonej u onej odwrotnie niż chcemy sortować.. Sortowanie tablicy wejściowej 9 8 7 6 5 4 3 2 1 0 rosnąco algorytmem quicksort zajmie więcej czasu niż np.. przez wstawianie lub przez wybór. 10
5. Szybkie sortowanie - quicksort Quicksort w języku j C funkcja qsort( ) ) z <stdlib.h< stdlib.h>. Nagłówek funkcji: void qsort(void *base, int nelem, int width, int gdzie: (*fcmp fcmp)(const void *, const void *)) base zrzutowany adres pierwszego elementu tablicy nelem liczba elementów w tablicy width rozmiar pojedynczego elementu tablicy fcmp funkcja porównuj wnująca, która zwraca 0 gdy elementy sąs równe, liczbę dodatnią gdy pierwszy jest większy, liczbę ujemną gdy drugi jest większy 5. Szybkie sortowanie - quicksort Przykład użycia u funkcji qsort( ) ) w programie: #include <stdio.h< stdio.h> #include <stdlib.h< stdlib.h> #include <string.h< string.h> char list[5][4] = { "cat", "car", "cab", "cap", "can" }; int sort_function( ( const void *a, const void *b) { return( strcmp((char *)a,(char *)b) ); } int main(void) { int x; qsort((void *)list, 5, sizeof(list[0]), sort_function); for (x = 0; x < 5; x++) printf("%s\n", ", list[x]); return 0; } 11
6. Zadanie do zrobienia Napisz programy zawierające implementację przedstawionych algorytmów sortowania. Wykorzystaj je do posortowania tablicy 10- elementowej liczb rzeczywistych. Wykorzystuj funkcje użytkownika! Dziękuj kuję za uwagę 12