Algorytmy. i podstawy programowania. eci. Proste algorytmy sortowania tablic. 4. Wskaźniki i dynamiczna alokacja pami



Podobne dokumenty
Problem plecakowy (KNAPSACK PROBLEM).

INSTYTUT BADAŃ SYSTEMOWYCH PAN WYDZIA L MATEMATYKI I NAUK INFORMACYJNYCH POLITECHNIKI WARSZAWSKIEJ. Algorytmy. i podstawy programowania

Zapis informacji, systemy pozycyjne 1. Literatura Jerzy Grębosz, Symfonia C++ standard. Harvey M. Deitl, Paul J. Deitl, Arkana C++. Programowanie.

Twierdzenie Bezouta i liczby zespolone Javier de Lucas. Rozwi azanie 2. Z twierdzenia dzielenia wielomianów, mamy, że

STATYSTYKA MATEMATYCZNA WYKŁAD 5 WERYFIKACJA HIPOTEZ NIEPARAMETRYCZNYCH

Sortowanie szybkie Quick Sort

Badania operacyjne w logistyce i zarządzaniu produkcją

ZESTAW ZADAŃ Z INFORMATYKI

Zaawansowane metody numeryczne Komputerowa analiza zagadnień różniczkowych 1. Układy równań liniowych

Analiza danych OGÓLNY SCHEMAT. Dane treningowe (znana decyzja) Klasyfikator. Dane testowe (znana decyzja)

Urządzenia wejścia-wyjścia

I. Elementy analizy matematycznej

Laboratorium ochrony danych

Zestaw zadań 4: Przestrzenie wektorowe i podprzestrzenie. Liniowa niezależność. Sumy i sumy proste podprzestrzeni.

Problemy jednoczesnego testowania wielu hipotez statystycznych i ich zastosowania w analizie mikromacierzy DNA

Paradygmaty programowania. Paradygmaty programowania

BADANIA OPERACYJNE. Podejmowanie decyzji w warunkach niepewności. dr Adam Sojda

Sztuczne sieci neuronowe

Plan wykładu: Typowe dane. Jednoczynnikowa Analiza wariancji. Zasada: porównać zmienność pomiędzy i wewnątrz grup

SYSTEM ZALICZEŃ ĆWICZEŃ

D Archiwum Prac Dyplomowych - Instrukcja dla studentów

ZASADY PROGRAMOWANIA KOMPUTERÓW

Weryfikacja hipotez dla wielu populacji

Zaawansowane metody numeryczne

Programowanie Równoległe i Rozproszone

Krzysztof Borowski Zastosowanie metody wideł cenowych w analizie technicznej

Przykład 5.1. Kratownica dwukrotnie statycznie niewyznaczalna

STARE A NOWE KRAJE UE KONKURENCYJNOŚĆ POLSKIEGO EKSPORTU

Wykład 2: Uczenie nadzorowane sieci neuronowych - I

Ćwiczenie 10. Metody eksploracji danych

Projekt 6 6. ROZWIĄZYWANIE RÓWNAŃ NIELINIOWYCH CAŁKOWANIE NUMERYCZNE

Zmodyfikowana technika programowania dynamicznego

5. OPTYMALIZACJA GRAFOWO-SIECIOWA

Podstawy teorii falek (Wavelets)

Analiza rodzajów skutków i krytyczności uszkodzeń FMECA/FMEA według MIL STD A

W praktyce często zdarza się, że wyniki obu prób możemy traktować jako. wyniki pomiarów na tym samym elemencie populacji np.

MATEMATYKA POZIOM ROZSZERZONY Kryteria oceniania odpowiedzi. Arkusz A II. Strona 1 z 5

Rozwiązywanie zadań optymalizacji w środowisku programu MATLAB

Wykład 2: Uczenie nadzorowane sieci neuronowych - I

WPROWADZENIE DO TEORII DECYZJI STATYSTYCZNYCH

WikiWS For Business Sharks

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Modele wieloczynnikowe. Modele wieloczynnikowe. Modele wieloczynnikowe ogólne. α β β β ε. Analiza i Zarządzanie Portfelem cz. 4.

Paradygmaty programowania

ZASTOSOWANIE KLASYCZNEGO ALGORYTMU GENETYCZNEGO DO ROZWIĄZANIA ZBILANSOWANEGO ZAGADNIENIA TRANSPORTOWEGO

Proste modele ze złożonym zachowaniem czyli o chaosie

Wyk lad 7 Baza i wymiar przestrzeni liniowej

PODSTAWA WYMIARU ORAZ WYSOKOŚĆ EMERYTURY USTALANEJ NA DOTYCHCZASOWYCH ZASADACH

ANALIZA PREFERENCJI SŁUCHACZY UNIWERSYTETU TRZECIEGO WIEKU Z WYKORZYSTANIEM WYBRANYCH METOD NIESYMETRYCZNEGO SKALOWANIA WIELOWYMIAROWEGO

Dyskretne modele populacji

Badanie współzależności dwóch cech ilościowych X i Y. Analiza korelacji prostej

± Δ. Podstawowe pojęcia procesu pomiarowego. x rzeczywiste. Określenie jakości poznania rzeczywistości

ZAGADNIENIE TRANSPORTOWE

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Wykład 1 Zagadnienie brzegowe liniowej teorii sprężystości. Metody rozwiązywania, metody wytrzymałości materiałów. Zestawienie wzorów i określeń.

7. Wykład VII: Warunki Kuhna-Tuckera

Poszukiwanie optymalnego wyrównania harmonogramu zatrudnienia metodą analityczną

Wstęp Funkcja pliki nagłówkowe i typ tablicowy. Wstęp Pliki nagłówkowe i typ tablicowy. Wstęp Funkcja fill_array() Wstęp. Notatki. Notatki.

Ćw. 2. Wyznaczanie wartości średniego współczynnika tarcia i sprawności śrub złącznych oraz uzyskanego przez nie zacisku dla określonego momentu.

RÓWNOWAGA STACKELBERGA W GRACH SEKWENCYJNYCH

Rozdzia l 11. Przestrzenie Euklidesowe Definicja, iloczyn skalarny i norma. iloczynem skalarnym.

Grupowanie dokumentów XML ze względu na ich strukturę, z wykorzystaniem XQuery

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Definicje ogólne

SZTUCZNA INTELIGENCJA

Rozdzia l 3. Laboratorium 3. danych zawierajac

11/22/2014. Jeśli stała c jest równa zero to takie gry nazywamy grami o sumie zerowej.

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Minister Edukacji Narodowej Pani Katarzyna HALL Ministerstwo Edukacji Narodowej al. J. Ch. Szucha Warszawa Dnia 03 czerwca 2009 r.

Normy wektorów i macierzy

MIKROEKONOMIA Prof. nadzw. dr hab. Jacek Prokop

ORGANIZACJA ZAJĘĆ OPTYMALIZACJA GLOBALNA WSTĘP PLAN WYKŁADU. Wykładowca dr inż. Agnieszka Bołtuć, pokój 304,

Wyk lad 9 Podpierścienie, elementy odwracalne, dzielniki zera

Regulamin promocji 14 wiosna

Functionalization. Jeszcze o funkcjach i strukturze projektu. Marcin Makowski. 3 grudnia Zak lad Chemii Teoretycznej UJ

Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: Badania operacyjne. Temat ćwiczenia: Problemy rozkroju materiałowego, zagadnienia dualne

Statystyka Opisowa 2014 część 2. Katarzyna Lubnauer

Teoria miary WPPT IIr. semestr zimowy 2009 Wyk lady 6 i 7. Mierzalność w sensie Carathéodory ego Miara Lebesgue a na prostej

ANALIZA KORELACJI WYDATKÓW NA KULTURĘ Z BUDŻETU GMIN ORAZ WYKSZTAŁCENIA RADNYCH

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

KRZYWA BÉZIERA TWORZENIE I WIZUALIZACJA KRZYWYCH PARAMETRYCZNYCH NA PRZYKŁADZIE KRZYWEJ BÉZIERA

Stanisław Cichocki Natalia Nehrebecka. Zajęcia 4

ALGEBRY HALLA DLA POSETÓW SKOŃCZONEGO TYPU PRINJEKTYWNEGO

KURS STATYSTYKA. Lekcja 1 Statystyka opisowa ZADANIE DOMOWE. Strona 1

SZACOWANIE NIEPEWNOŚCI POMIARU METODĄ PROPAGACJI ROZKŁADÓW

METODA UNITARYZACJI ZEROWANEJ Porównanie obiektów przy ocenie wielokryterialnej. Ranking obiektów.

Odtworzenie wywodu metodą wstępującą (bottom up)

p Z(G). (G : Z({x i })),

PORADNIK KANDYDATA. Wkrótce w nauka w szkole w jaki sposób je. zasadniczych szkole

KOLOKWIUM PODSTAWY PROGRAMOWANIA

Matematyka A, klasówka, 24 maja zania zadań z kolokwium z matematyki A w nadziei, że pope lni lem wielu b le. rozwia

Stanisław Cichocki. Natalia Nehrebecka. Wykład 6

Czym jest całka? Całkowanie numeryczne

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

65120/ / / /200

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27


Paradygmaty programowania. Paradygmaty programowania

Drzewa AVL definicje

architektura komputerów w. 3 Arytmetyka komputerów

Transkrypt:

MAREK GAGOLEWSKI INSTYTUT BADAŃ SYSTEMOWYCH PAN Algorytmy podstawy programowana 4. Wskaźnk dynamczna alokaca pam ec. Proste algorytmy sortowana tablc Matera ly dydaktyczne dla studentów matematyk na Wydzale Matematyk Nauk Informacynych Poltechnk Warszawske Ostatna aktualzaca: 5 grudna 2012 r. Copyrght 2010 2013 Dr Marek G agolewsk Ths work s lcensed under a Creatve Commons Attrbuton 3.0 Unported Lcense.

SPIS TREŚCI 0 Sps treśc 4.1. Dynamczna alokaca pamec.......................... 1 4.1.1. Organzaca pamec komputera..................... 1 4.1.2. Wskaźnk................................. 1 4.1.3. Przydza l zwalnane pamec ze sterty................ 5 4.1.4. Tablce................................... 6 4.1.5. Przekazywane tablc funkcom..................... 9 4.2. Proste algorytmy sortowana tablc....................... 10 4.2.1. Sortowane przez wybór......................... 12 4.2.2. Sortowane przez wstawane...................... 15 4.2.3. Sortowane babelkowe.......................... 18 4.2.4. Efektywność oblczenowa........................ 23 Informaca Nnesze matera ly dydaktyczne wcaż sa daleke od doskona lośc. Jeśl znadzesz w nch b l edy, czegoś ne rozumesz, badź uważasz, że pomna lem coś stotnego, bardzo Ce prosze o stosowna nformace na mó adres e-mal: M.Gagolewsk@mn.pw.edu.pl. Dzeku e. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 1 4.1. Dynamczna alokaca pam ec 4.1.1. Organzaca pam ec komputera W drugm rozdzale skryptu dowedzelśmy se, że w pamec operacyne komputera przechowywane sa ne tylko dane, ale kod maszynowy programów. Podstawowa ednostka pamec est komórka o rozmarze ednego bata. Każda komórka pamec posada swó adres, który est reprezentowany we wspó lczesnych komputerach za pomoca 32- lub 64-btowe lczby ca lkowte. Z punktu wdzena każdego programu można wyróżnć nastepu acy podza l pul adresowe pamec (w tzw. archtekturze von Neumanna): kod programu nformace nterpretowane sa tuta ako nstrukce procesora, stos (ang. stack) gdze przechowywane sa wartośc zmennych lokalnych funkc, sterta (ang. heap) gdze znadua se dane dynamczne przydzelane (alokowane) na prośbe programu (zob. dale), cześć nedostepna zarzadzana przez system operacyny (m.n. dane nnych programów). Zatem każdy program przechowue dane potrzebne do wykonywana swych czynnośc na stose sterce. Stos est cześc a pamec operacyne, na które dane umeszczane kasowane sa w porzadku ostatn na weścu, perwszy na wyścu (LIFO, ang. last-n-frst-out). Umeszczane kasowane danych na stose odbywa se automatyczne. Każda wywo lywana funkca tworzy na stose mesce dla swoch zmennych lokalnych. Gdy funkca kończy dza lane, usuwa z nego te nformace (to dlatego zmenne lokalne przestaa wtedy stneć). Przyrzymy se rozszerzone wers lustrac z poprzednego rozdza lu (rys. 4.1). Po lewe strone wdzmy fragment funkc man(), w które zosta ly zadeklarowane zmenne x, y, z. Umeszczone sa one na dole stosu (ako perwsze w programe). Gdy funkca ta wywo lue f(), na stose tworzone est mesce dla zmennych n, m x. Gdy f() kończy swe dza lane, sa one ze stosu automatyczne usuwane. n,m,x... nt x = 8; nt y = 4; nt z = f(x, y);... 32 8 4 nt f(nt n, nt m) { nt x = n m; return x; } x,y,z f() Poczatek stosu Rys. 4.1. Zas eg zmennych 4.1.2. Wskaźnk Każda zmenna ma przyporzadkowan a komórke (badź komórk) pamec, w które przechowue swoe dane, np. zmenna typu nt zamue nacześce 4 take komórk (4 baty). Fzyczny adres zmenne (czyl numer komórk) można odczytać za pomoca operatora &. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 2 nt x; cout << " x znadue sę pod adresem " << & x << endl ; // np. 0 x e 3 d 3 0 d b c Przypomnmy, że 0xe3d30dbc oznacza lczbe ca lkowta zapsana w systeme szesnastkowym. W systeme dzesetnym est ona równa 3822259644. Co ważne, przy kolenym uruchomenu programu może to być nna wartość. Nas ednak nteresue tuta fakt, że est to zwyczana lczba. Każda zmenna ma zatem swoe mesce na mape (tzn. w pamec komputera), znaduace se pod pewnym adresem (np. na ul. Koszykowe 75 w Warszawe). Operator & pozwala wec uzyskać nformace o pozyc dane zmenne. Jeszcze nacze: zmenna to budynek magazynu w którym można przechowywać towar określonego rodzau, np. cukerk. Adres zmenne to wspó lrzedne GPS tegoż magazynu. Specalny typ danych do przechowywana nformac o adresach nnych zmennych ( wspó lrz ednych GPS ) określonego typu zwany est typem wskaźnkowym. Oznacza se go przez dodane symbolu * (gwazdka) bezpośredno po nazwe typu. Na przyk lad, zadeklarowane zmenne typu nt oznacza stworzene zmenne przechowuace fzyczny adres w pamec komputera pewne lczby ca lkowte (wspó lrz edne GPS pewnego magazynu do przechowywana cukerków), czyl wskaźnka na zmenna typu nt. Zapam eta Istnee specalne mesce w pamec o adrese 0 (NULL, czarna dzura ), do którego odwo lane se podczas dza lana programu powodue wystapene b l edu. Czesto używa se tego adresu np. do zancowana wskaźnków celem oznaczena, że poczatkowo ne wskazua one na żadne konkretne mesce. Na zmennych wskaźnkowych zosta l określony tzw. operator wy luskana, (ne mylć z gwazdka modyfkuac a znaczene typu!), dzek któremu możemy odczytać, co se znadue pod danym adresem pamec (co znadue se w akmś magazyne, którego znamy tylko wspó lrz edne GPS). Przyrzymy se ponższemu przyk ladow. Tworzone sa dwe zmenne: edna typu ca lkowtego, a druga wskaźnkowa. Ich rozmeszczene w pamec (a dok ladne na stose, sa to bowem zmenne lokalne akeś funkc) przedstawa rys. 4.2. Każda z tych zmennych umeszczona est pod akmś adresem w pamec RAM można go odczytać za pomoca operatora &. 1 nt x = 100; 2 nt wskx = &x; 3 Lstng 4.1. Wy luskane danych spod danego adresu 4 cout << wskx << endl ; // np. 0 x d f 5 9 0 5 4 4 5 cout << wskx << endl ; // 100 6 cout << x << endl ; // 100 Wypsane wartośc wskaźnka oznacza wypsane adresu, na który wskazue. Wypsane zaś wy luskanego wskaźnka powodue wydrukowane wartośc komórk pamec, na która pokazue wskaźnk. Jako że zmenna typu nt u nas ma rozmar 4 batów, adres nastepne zmenne (wskx) est o 4 ednostk wekszy od adresu x. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 3 wskx 0xdf590548 x 0xdf590544 (nt*) 0xdf590544 (nt) 100 Rys. 4.2. Zawartość pam ec komputera w programe z lstngu 4.1 Aby eszcze lepe zrozumeć omawane zagadnene, rozważmy fragment kolenego programu. Lstng 4.2. Proste operace z użycem wskaźnków 1 nt x, y; 2 nt w; 3 w = &x; // w = a d r e s x ( n e c h w w s k a z u e na zmenna x ) 4 w = 1; // wstaw 1 tam, g d z e w s k a z u e t e r a z w 5 w = &y; // w = a d r e s y ( n e c h w w s k a z u e na zmenna y ) 6 w = 2; // wstaw 2 tam, g d z e w s k a z u e t e r a z w Zawartość pamec po wykonanu kolenych ln kodu przedstawa rys. 4.3. Tym razem za pomoca operatora wy luskana zapsuemy dane do komórek pamec, na które pokazue wskaźnk w. Zadane Prześledź pokazane rysunk bardzo uważne. Wskaźnk sa nezmerne stotnym elementem ezyka C++. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 4 1: nt x, y; 2: nt w; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*)? (nt)? (nt)? 3: w = &x; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590500 (nt)? (nt)? 4: w = 1; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590500 (nt)? (nt) 1 5: w = &y; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590504 (nt)? (nt) 1 6: w = 2; w 0xdf590508 y 0xdf590504 x 0xdf590500 (nt*) 0xdf590504 (nt) 2 (nt) 1 Rys. 4.3. Zawartość pam ec po wykonanu kolenych nstrukc z lstngu 4.2 Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 5 Przyk lad z rozdz. 3 (cd.). W poprzednm rozdzale rozważalśmy funkce, która s luży la do zamany wartośc dwóch zmennych ca lkowtych. Przypomnmy, że prawd lowe rozwazane tego problemu wymaga lo użyca ne argumentów przekazanych przez wartość, ale przez reference. Równe skutecznym, acz w tym wypadku może neco mne eleganckm, est użyce w tym przypadku wskaźnków. 1 vod zamen ( nt x, nt y) { 2 nt t = x; 3 x = y; 4 y = t; 5 } 6 7 nt man () { 8 nt n = 1, m = 2; 9 zamen (&n, &m); // p r z e k a z a n e argumentów p r z e z w s k a ź n k 10 cout << n << ", " << m << endl ; 11 return 0; 12 } Dzek temu, że przekazalśmy funkc zamen() adresy zmennych zadeklarowanych w funkc man(), możemy ne tylko odczytywać, ale nadpsywać tuta ch wartośc. Omnelśmy tym samym ogranczena przekazywana argumentów przez wartość (kopowane) dostep do orygnalnych zmennych mamy tuta w sposób pośredn, t. za pomoca operatora wy luskana. Cekawostka Pam etamy, że aby dostać s e do konkretnego pola struktury, należy użyć operatora. (kropk). Jeśl mamy dost ep do wskaźnka na struktur e, możemy użyć do tego celu operatora >. struct Punkt { double x; double y; }; //... ( np. man ( ) )... Punkt p; Punkt wp = &p; // w s k a ź n k na p wp >x = 1.0; // t o samo, co ( * wp ). x = 1. 0 d r u g e m n e wygodne wp >y = 2.0; // t o samo, co ( * wp ). y = 2. 0 //... 4.1.3. Przydza l zwalnane pamec ze sterty Oprócz ścśle określone na etape psana programu lośc danych na stose, można równeż dysponować pamec a na sterce, por. s. 1. Mesce na nasze dane może być przydzelane (alokowane) dynamczne podczas dza lana programu za pomoca operatora new. Po użycu należy e zwolnć za pomoca operatora delete. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 6 Zapam eta Zaalokowany obekt bedze stna l w pamec nawet po wyścu z funkc, w które go stworzylśmy! Dlatego należy pametać, aby go usunać w pewnym mescu kodu. Oto, w ak sposób możemy dokonać alokac dealokac pam ec dla ednego obektu. typ obekt = new typ ; // a l o k a c a ( new z w r a c a w s k a ź n k na p r z y d z e l o n e m e s c e w p a m e c ) //... delete obekt ; // z w o l n e n e p a m e c Co bardzo ważne, możemy w ten sposób równeż przydzelć pameć na wele obektów nastepu acych koleno po sobe. nt n = 4; typ obekt = new typ [n]; // a l o k a c a ( z w r a c a w s k a ź n k na p e r w s z y z o b e k t ó w ) //... delete [] obekt ; // uwaga na,, [ ] ' ' w e l e o b e k t ó w! Za pomoca powyższego kodu utworzylśmy cag obektów określonego typu, czyl nacze tablce. 4.1.4. Tablce Do te pory przechowywalśmy dane używaac poedynczych zmennych. By ly to tzw. zmenne skalarne (atomowe). Poedyncza zmenna odpowada la edne ednostce nformac (lczbe, wartośc logczne, z lożone strukturze, wskaźnkow). Czesto ednak w naszych programach bedze zachodzć potrzeba rozważena cagu n zmennych tego samego typu, gdze n nekoneczne mus być znane z góry. Dla przyk ladu, rozważmy fragment programu dokonuacy podsumowana rocznych zarobków pewnego dość obrotnego studenta. 1 double zarobk1, zarobk2, /*... */, zarobk12 ; 2 // d e k l a r a c a 12 z m e n n y c h 3 zarobk1 = 1399.0; // s t y c z e ń 4 zarobk2 = 1493.0; // l u t y 5 //... 6 zarobk12 = 999.99; // g r u d z e ń 7 8 double suma = 0. 0; 9 suma += zarobk1 ; 10 suma += zarobk2 ; 11 //... 12 suma += zarobk12 ; 13 14 cout << " Zarobłem w 2012 r. " << suma << " zł."; Dochód z każdego mesaca przechowywany est w oddzelne zmenne. Netrudno zauważyć, że operowane na nch ne est zbyt wygodne. Ma lo tego, dość żmudne by loby rozszerzane funkconalnośc takego programu na przypadek obemuacy podsumowane np. zarobków z 2,3,... lat. Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 7 Rozwazane tego problemu może być ednak bardzo czytelne zapsane z użycem dynamczne alokowanych tablc, które sa reprezentaca znanych nam obektów matematycznych: cagów skończonych badź wektorów. Wemy, że za pomoca operatora new możemy przydzelć pameć dla n 1 obektów określonego typu. Operator ten zwraca wskaźnk na perwszy element takego cagu. Pozostae tylko odpowedzeć sobe na pytane, w ak sposób możemy se dostać do kolenych elementów. double zarobk = new double [ 12]; // z a r o b k w s k a z n k na p e r w s z y e l e m e n t c a g u zarobk = 1399.0; // wprowadź z a r o b k w p e r w s z y m m e s a c u // co d a l e? delete [] zarobk ; // z w o l n e n e p a m e c Przypomnmy, wskaźnk est po prawdze lczba ca lkowta. Okazue se, że zosta la określona na nm operaca dodawana. I tak zarobk+, gdze est lczba ca lkowta neuemna, oznacza poda adres -tego obektu z cagu. Tym samym zarobk+0 est tym samym, co po prostu zarobk (adresem perwszego elementu), a zarobk+n 1, adresem ostatnego elementu z n-elementowego cagu. Wobec powyższego, fragment perwotne wers programu zwazany z wprowadzenem zarobków możemy zapsać w nastepu acy sposób: double zarobk = new double [ 12]; // z a r o b k w s k a z n k na p e r w s z y e l e m e n t c a g u ( zarobk +0) = 1399.0; // wprowadź z a r o b k w p e r w s z y m m e s a c u ( zarobk +1) = 1493.0; // wprowadź z a r o b k w drugm m e s a c u //... ( zarobk +11) = 999.99; // wprowadź z a r o b k w o s t a t n m m e s a c u //... delete [] zarobk ; // z w o l n e n e p a m e c Zapam eta Wygodneszy dostep do poszczególnych elementów tablcy możemy uzyskać za pomoca operatora ndeksowana, [ ]. Jeśl t est tablca (a ścśle: wskaźnkem na perwszy element cagu obektów przydzelonych dynamczne), to (t+) możemy zapsać równoważne przez t[]. Elementy tablcy sa numerowane od 0 do n 1, gdze n to rozmar tablcy. Operator ndeksowana przymue za argument dowolna wartość ca lkowta (np. sta l a badź wyrażene arytmetyczne). Każdy element tablcy traktuemy tak, akby by l zwyk l a zmenna taka, z która do te pory melśmy do czynena. Informaca W ezyku C++ ne ma mechanzmów sprawdzana poprawnośc ndeksów! Nastepu- acy kod być może (ne wadomo) ne spowodue b l edu natychmast po uruchomenu. 1 nt t = new nt [5]; 2 t[ 100] = 15123; // : ( 3 t [10000] = 25326; // : ( 4 delete [] t; Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 8 Powyższe nstrukce ednak zmenaa wartośc komórek pamec reprezentuacych dane nnych obektów. Skutk tego dza lana moga se obawć w nnym mescu programu, powoduac neprzewdywalne trudne do wykryca b l edy. Cekawostka Nech t bedze wskaźnkem na pewen typ. Zauważmy, że zaps t+ ne oznacza koneczne, że chodz nam o adres przechowywany w zmenne wskaźnkowe t plus eden bat. Operaca dodawana berze pod uwage typ zmenne wskaźnkowe dokonue przesuneca adresu o welokrotność lczby batów, które zamue w pamec edna zmenna typu typ. Możemy to sprawdzć np. w nastepu acy sposób. 1 nt t = new nt [3]; // u n a s n t t o 4 b a t y 2 cout << t; // np. 0 x 9 b64e300 t o samo, co c o u t << &t [ 0 ] ; 3 cout << t +1; // np. 0 x 9 b64e304 t o samo, co c o u t << &t [ 1 ] ; 4 cout << t +2; // np. 0 x 9 b64e308 t o samo, co c o u t << &t [ 2 ] ; 5 t [0] = 1; 6 t [1] = 2; 7 t [2] = 3; 8 delete [] t; Kolene elementy tablcy w pamec zawsze nastepu a po sobe, co lustrue ponższy rysunek. t t[2] 0x9b64e308 t[1] 0x9b64e304 t[0] 0x9b64e300 (nt) 3 (nt) 2 (nt) 1 Jesteśmy uż gotow, by napsać fragment programu do sumowana zarobków naszego koleg. Tym razem ne bedzemy zak ladać, że lczba mesecy est określona z góry. Tuta bedzemy a wprowadzać z klawatury. 1 nt n; 2 cout << " Ile mesęcy? "; 3 cn >> n; 4 assert (n >0) ; // wymaga <c a s s e r t > 5 6 double zarobk = new double [ n]; 7 8 for ( nt =0; <n; ++) { 9 cout << " Poda zarobk w mesącu nr " << << ": "; 10 cn >> zarobk []; // t o samo, co c n >> * ( z a r o b k + ) ; 11 } 12 13 // t u t a możemy np. wygenerować l a d n e z e s t a w e n e Ostatna aktualzaca: 5 grudna 2012 r.

4.1. DYNAMICZNA ALOKACJA PAMIECI 9 14 // wprowadzonych danych t p. 15 for ( nt =0; <n; ++) 16 cout << << ": " << zarobk [ ] << endl ; 17 18 // p o l c z m y sum e : 19 double suma = 0. 0; 20 for ( nt =0; <n; ++) 21 suma += zarobk []; 22 23 cout << " Zarobłem w 2012 r. " << suma << " zł."; 24 25 delete [] zarobk ; Cekawostka W ezyku C++ można także deklarować tablce o ustalonym z góry, sta lym rozmarze (na stose). Ich zaleta est możlwość ustalena wartośc ch elementów podczas deklarac, co może poprawać czytelność programów demonstruacych mplementace pewnych szczególnych algorytmów. 1 nt t [3] = {1, 2, 3}; // d e k l a r a c a t a b l c y n c o w a n e w a r t o ś c 2 // t w c a ż e s t w s k a ź n k e m na p e r w s z y e l e m e n t : 3 // używamy go tak, a k w p r z y p a d k u t a b l c y d y n a m c z n e a l o k o w a n e 4 //... 5 // n e s t o s u e m y d e l e t e! ( bo n e b y l o new ) Jednak w przypadku duże klasy problemów ch mplementaca z użycem tablc o zadanym rozmarze wydae s e ma lo naturalna s labo skalowalna wzgl edem rozmaru problemu. 4.1.5. Przekazywane tablc funkcom Podsumumy: tablca to cag obektów tego samego typu po lożonych w pamec koleno, eden po drugm. Dostep do elementów tablcy mamy zapewnony przez wskaźnk na perwszy z tych obektów. Obekty typu wskaźnkowego możemy przekazywać funkcom tak, ak zwyk le zmenne skalarne. Wobec tego, aby można by lo napsać funkce, która w akś sposób przetwarza dane zawarte w tablcy, należy dodatkowo przekazać e nformace o tym, le est elementów w tablcy, czyl e rozmar. Cekawostka W rozdzale 5 poznamy nny sposób nformowana funkc, gdze znadue se ostatn element tablcy. Za lożymy wtedy, że ostatnm elementem cagu est pewna specalna wyróżnona wartość, (tzw. wartownk) która ne poawa se ako zwyk ly element gdze ndze. Wówczas wystarczy nam tylko nformaca na temat po lożena perwszego elementu tablcy. Je konec bowem bedzemy mogl sam sobe znaleźć. Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 10 Przyk lad. Funkca wyznaczaaca sume wartośc elementów z podane tablcy. 1 double suma ( double const t, nt n) 2 { // d o s t e p do elementów t t y l k o do o d c z y t u 3 assert (n > 0); 4 double s = 0. 0; 5 for ( nt =0; <n; ++) 6 s += t[]; 7 return s; 8 } 9 10 nt man ( vod ) 11 { 12 nt le = 10; 13 double punkty = new double [ le ]; 14 for ( nt =0; <le ; ++) 15 cn >> punkty []; 16 cout << suma ( punkty, le ); // p r z e k a z a n e t a b l c y do f u n k c 17 delete [] punkty ; 18 return 0; 19 } Na margnese, zauważmy, że funkca suma() ne ma żadnych efektów ubocznych. Ne wypsue nc na ekran an o nc ne pyta se użytkownka. Wyznacza tylko wartość sumy elementów zawartych w tablcy czyl tylko to, czego użytkownk (funkca man()) może se po ne spodzewać. Ponadto zaps double const zapewna, że elementów dane tablcy ne można zmenać. Jest to tzw. wskaźnk na wartośc sta le. 4.2. Proste algorytmy sortowana tablc Zadane Wyobraź sobe, le czasu zae loby C znalezene has la w s lownku (chodz oczywśce o s lownk ksażkowy), gdyby redaktorzy przyelby losowa koleność wyrazów. Przeanalzu z akego algorytmu korzystasz wyszuku ac to, co Ce nteresue. Rozważymy teraz problem sortowana tablc ednowymarowych, który est stotny w welu zastosowanach, zarówno teoretycznych ak praktycznych. Dzek odpowednemu uporzadkowanu elementów nektóre algorytmy (np. wyszukwana) moga dza lać szybce, moga być prostsze w napsanu czy też można latwe formalne udowodnć ch poprawność. Co wece, stnee wcale nema lo zagadneń, które wprost wymagaa pewnego uporzad- kowana danych które bez take operac wcale ne maa sensu. Zadane Przyk ladowo, rozważmy w ak sposób wyszukuemy nteresuace nas strony nternetowe. Wekszość wyszukwarek dza la w nastepu acy sposób. Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 11 1. Znadź wszystke strony w baze danych, które zaweraa podane przez użytkownka s lowa kluczowe (np. kaszel, goraczka obawy ). 2. Oceń każda znalezona strone pod wzgledem pewne mary adekwatnośc/popularnośc- /akośc. 3. Posortu wynk zgodne z ocenam (od nalepsze do nagorsze ) pokaż ch lste użytkownkow. Warto przypomneć, że o rynkowym sukcese wyszukwark Google zadecydowa lo to, że w przecweństwe do ówczesnych konkurencynych serwsów zwraca la ona wynk w dość pożyteczne dla w ekszośc osób kolenośc. Problem sortowana, w swe naprostsze postac, można sformalzować w nastepu acy sposób. Dana est tablca t rozmaru n zaweraaca elementy, które można porównywać za pomoca operatora relacynego <=. Należy zmenć koleność (t. dokonać permutac, uporzadkowana) elementów t tak, by zachodz ly warunk: t[0] <= t[1], t[1] <= t[2],..., t[n 2] <= t[n 1]. Cekawostka Zauważmy, że rozwazane takego problemu wcale ne mus być ednoznaczne. Dla tablc zaweraacych elementy t[] t[] take, że dla zachodz t[] <= t[] oraz t[] <= t[], t. t[] == t[], może stnee wece nż edna permutaca spe lnaaca powyższe warunk. Algorytm sortowana nazwemy stablnym, eśl wzgledna koleność elementów o te same wartośc zostae zachowana po posortowanu. W lasność ta est przydatna w przypadku sortowana obektów z lożonych za pomoca wece nż ednego kryterum na raz. W nneszym paragrafe omówmy trzy algorytmy sortowana: 1. sortowane przez wybór, 2. sortowane przez wstawane, 3. sortowane babelkowe. Algorytmy te cechua se tym, że w pesymstycznym ( nagorszym ) przypadku lczba operac porównań elementów tablcy est proporconalna do n 2 (zob. dale, podrozdz. 4.2.4). Bardze wydane, co za tym dze, bardze z lożone algorytmy sortowana bed a omówone w semestrze III (np. sortowane szybke, przez l aczene, przez kopcowane). Nektóre z nch wymagaa co nawyże kn log n porównań dla pewnego k. Dzek temu dla tablc o dużym rozmarze dza la a naprawde szybko. Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 12 4.2.1. Sortowane przez wybór W algorytme sortowana przez wybór (ang. selecton sort) dokonuemy za każdym razem wyboru elementu namneszego spośród do te pory neposortowanych, pók ca la tablca ne zostane uporzadkowana. Idee te przedstawa nastepu acy pseudokod: dla =0,1,...,n 2 { // t [ 0 ],..., t [ 1] s a u ż u p o r za d k o w a n e wzgledem r e l a c <= // ( nadto, s a u ż na s w o c h o s t a t e c z n y c h m e s c a c h ) = ndeks namneszego elementu spośród t[],..., t[n 1]; zameń elementy t[] t[]; } Jako przyk lad rozważmy, krok po kroku, przebeg sortowana cagu lczb naturalnych (4,1,3,5,2). Kolene terace dza lana tego algorytmu lustrua rys. 4.4 4.8. 1. W kroku I (rys. 4.4) mamy ==0. Dokonuac wyboru elementu namneszego spośród t[0],..., t[4] otrzymuemy ==1. Zamenamy wec elementy t[0] t[1] mescam. 2. W kroku II (rys. 4.5) mamy ==1. Wybór namneszego elementu wśród t[1],..., t[4] dae ==4 Zamenamy mescam zatem t[1] t[4]. 3. Dale (rys. 4.6), ==2. Elementem namneszym spośród t[2],..., t[4] est t[] dla ==2 Zamenamy mescam zatem nezbyt sensowne t[2] t[2]. Komputer, na szcześce, zrob to bez grymasu. 4. W ostatnm kroku (rys. 4.7) ==3 ==4, dzek czemu możemy uzyskać ostateczne rozwazane (rys. 4.8). Ostatna aktualzaca: 5 grudna 2012 r.

Ostatna aktualzaca: 5 grudna 2012 r. 4 1 3 5 2 4 1 3 5 2 1 4 3 5 2 Rys. 4.4. Sortowane przez wybór przyk lad teraca I 1 4 3 5 2 1 4 3 5 2 1 2 3 5 4 Rys. 4.5. Sortowane przez wybór przyk lad teraca II 1 2 3 5 4 1 2 3 5 4 1 2 3 5 4 Rys. 4.6. Sortowane przez wybór przyk lad teraca III 4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 13

Ostatna aktualzaca: 5 grudna 2012 r. 1 2 3 5 4 1 2 3 5 4 Rys. 4.7. Sortowane przez wybór przyk lad teraca IV 1 2 3 4 5 Rys. 4.8. Sortowane przez wybór przyk lad rozwazane 1 2 3 4 5 4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 14

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 15 4.2.2. Sortowane przez wstawane Algorytm sortowana przez wstawane (ang. nserton sort) est metoda czesto stosowana w praktyce do porzadkowana ma le lczby elementów (do ok. 20 30) ze wzgledu na swa prostote szybkość dza lana. W nnesze metodze w -tym kroku elementy t[0],..., t[ 1] sa uż wstepne uporzadkowane wzgledem relac <=. Pomedzy ne wstawamy t[] tak, by ne zaburzyć porzadku. Formalne rzecz umuac, dea ta może być wyrażona za pomoca pseudokodu: dla =1,2,...,n 1 { // t [ 0 ],..., t [ 1] s a w s t e p n e u p o r za d k o w a n e wzgledem <= // ( a l e n e k o n e c z n e e s t t o c h o s t a t e c z n e m e s c e ) = ndeks takego elementu spośród t [0],..., t[], że t[u] <= t[] dla każdego u < oraz t[] < t[v] dla każdego v ; eśl ( < ) wstaw t[] przed t[]; } gdze przez operace wstaw t[] przed t[], dla 0 < rozumemy cag dza lań, maacy na celu przestawene kolenośc elementów tablcy: t[0]... t[ 1] t[]... t[ 1] t[] t[+1]... t[n 1] tak, by uzyskać: t[0]... t[ 1] t[] t[]... t[ 1] t[+1]... t[n 1] Powyższy pseudokod może być wyrażony w nastepu ace równoważne forme: dla =1,2,...,n 1 { // t [ 0 ],..., t [ 1] s a u p o r za d k o w a n e wzgledem <= // ( a l e n e k o n e c z n e e s t t o c h o s t a t e c z n e m e s c e ) znadź nawększe ze zboru {0,..., } take, że == 0 lub t[ 1] <= t[]; eśl ( < ) wstaw t[] przed t[]; } Jako przyk lad rozpatrzmy znów cag lczb naturalnych (4,1,3,5,2). Przebeg kolenych wykonywanych kroków przedstawaa rys. 4.9 4.12. Cekawostka Można pokazać, że tak sformu lowany algorytm est stablny. Prześledź ego dza lane np. dla cagu (2, 4, 2, 5, 1, 3) (dla czytelnośc te same elementy wyróżnlśmy, by wskazać ch perwotny porzadek). Porówna uzyskany wynk z tym, który można uzyskać za pomoca algorytmu sortowana przez wybór. Ostatna aktualzaca: 5 grudna 2012 r.

Ostatna aktualzaca: 5 grudna 2012 r. 4 1 3 5 2 4 1 3 5 2 1 4 3 5 2 Rys. 4.9. Sortowane przez wstawane przyk lad teraca I 1 4 3 5 2 1 4 3 5 2 1 3 4 5 2 Rys. 4.10. Sortowane przez wstawane przyk lad teraca II 1 3 4 5 2 1 3 4 5 2 1 3 4 5 2 Rys. 4.11. Sortowane przez wstawane przyk lad teraca III 4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 16

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 17 1 3 4 5 2 1 3 4 5 2 1 2 3 4 5 Rys. 4.12. Sortowane przez wstawane przyk lad teraca IV Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 18 4.2.3. Sortowane babelkowe Sortowane babelkowe (ang. bubble sort) est nteresuacym przyk ladem algorytmu poawaacego se w wekszośc podrecznków akademckch dotyczacych podstawowych sposobów sortowana tablc, którego prawe wcale ne stosue se go w praktyce. Jego wydaność est bowem bardzo s laba w porównanu do dwóch metod opsanych powyże. Z druge strony, posada on sympatyczna hydrologczna (nautyczna?) nterpretace, która urzeka welu wyk ladowców, w tym skromnego autora nnesze ksażeczk. Tak umotywowan, przystapmy wec do zapoznana se z nm. W tym algorytme porównywane sa tylko elementy ze soba bezpośredno sasadu ace. Jeśl okaże se, że ne zachowua one odpowedne kolenośc wzgledem relac <=, element ceższy wypychany est w góre, nczym pecherzyk powetrza (tytu lowy b abelek) pod powerzchna wody. A oto pseudokod: dla =n 1,...,1 { dla =0,..., 1 { } // p o r ó w n u e l e m e n t y p a r a m eśl (t[] > t[ +1]) zameń t[] t[ +1]; // t z n. w y p c h n c e ż s z e g o b a b e l k a w g ó r e } // t u t a e l e m e n t y t [ ],..., t [ n 1] s a u ż na s w o c h m e s c a c h Dla przyk ladu rozpatrzmy ponowne tablce (4,1,3,5,2). Przebeg kolenych wykonywanych kroków przedstawaa rys. 4.13 4.17. Cekawostka Ten algorytm równeż est stablny. Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 19 4 1 3 5 2? 4 1 3 5 2? 1 4 3 5 2? 1 3 4 5 2? 1 3 4 5 2 Rys. 4.13. Sortowane babelkowe przyk lad krok I Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 20 1 3 4 2 5? 1 3 4 2 5? 1 3 4 2 5 1 3 4 2 5? Rys. 4.14. Sortowane babelkowe przyk lad krok II Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 21 1 3 2 4 5? 1 3 2 4 5? 1 3 2 4 5 Rys. 4.15. Sortowane babelkowe przyk lad krok III Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 22 1 2 3 4 5? 1 2 3 4 5 Rys. 4.16. Sortowane babelkowe przyk lad krok IV 1 2 3 4 5 Rys. 4.17. Sortowane babelkowe przyk lad rozwazane Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 23 4.2.4. Efektywność oblczenowa Rozważaac algorytmy sortowana w sposób oczywsty obserwuemy wspomnane w perwszym rozdzale zawsko eden problem wele algorytmów. Rzecz asna, trzy podane wyże algorytmy (co zreszta zosta lo zapowedzane) ne wyczerpua wszystkch możlwośc rozwazana zagadnena sortowana tablc ednowymarowych. Nasuwa se wec pytane: skoro każda z metod znadue rozwazane danego problemu w poprawny sposób, ake przes lank pownny nam kerować przy wyborze algorytmu w zastosowanach praktycznych? Lenuszk z pewnośc a wybra lyby algorytm naprostszy w mplementac. Domyślamy se ednak, że ne est to zbyt roztropne kryterum. W tzw. analze algorytmów wyróżna s e dwe naważnesze mary efektywnośc oblczenowe: 1. z lożoność czasowa czyl lczbe tzw. operac znaczacych (zależna od danego problemu; moga to być przestawena, porównana, operace arytmetyczne tp.) potrzebnych do rozwazana danego zagadnena, 2. z lożoność pamecowa czyl lość dodatkowe pamec potrzebne do rozwazana problemu. Zauważmy, że w przypadku przedstawonych wyże algorytmów, oprócz dane tablcy która należy posortować klku zmennych pomocnczych ne est potrzebna żadna dodatkowa lczba komórek pamec komputera (w przypadku bardze z lożonych metod omawanych w sem. III bedze ednak nacze, np. koneczne bedze użyce eszcze edne tablcy). Skupmy se wec teraz tylko na omówenu z lożonośc czasowe. Przyrzymy se zatem przyk ladowym mplementacom dwóch algorytmów dla dane tablcy t rozmaru n. Oto kod stosuacy sortowane przez wybór: 1 // S o r t o w a n e p r z e z wybór : 2 for ( nt =0; <n 1; ++) 3 { 4 // z n a d ź n d e k s namn. e l. s p o ś r ó d t [ ],..., t [ n 1 ] ; 5 nt = ; 6 for ( nt k= +1; k<n; ++k) 7 f (t[k] < t[]) // p o r ó w n a n e elementów 8 = k; 9 10 // zamana 11 nt p = t[]; 12 t[] = t[]; 13 t[] = p; 14 } A oto kod sortuacy tablce babelkowo : 1 // S o r t o w a n e b a b e l k o w e : 2 for ( nt =n 1; >0; ) 3 { 4 for ( nt =0; <; ++) 5 { 6 f (t[] > t[ +1]) // p o r o w n a n e p a r a m 7 { 8 nt p = t[]; // zamana 9 t[] = t[ +1]; Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 24 10 t[ +1] = p; 11 } 12 } 13 } Po perwsze, musmy podkreślć, ż formalne rzecz borac z lożoność czasowa wyznacza se ne dla abstrakcynego algorytmu, tylko dla ego konkretne mplementac. Implementaca zależna est, rzecz asna, od stosowanego ezyka programowana zdolnośc programsty. Ne pownno to nas dzwć, poneważ np. za wysokm pozom abstrakc stosowanym czesto w pseudokodach może kryć se naprawde wele skomplkowanych nstrukc ezyka programowana. Po druge, zauważmy, że z lożoność est nacześce zależna od danych weścowych. W naszym przypadku est to ne tylko rozmar tablcy, n, ale także e wstepne uporzad- kowane. Z tego też powodu lczbe operac znaczacych pownno podawać se w postac funkc rozmaru zboru danych weścowych (u nas est to po prostu n) w różnych sytuacach, nacześce co namne: 1. w przypadku pesymstycznym, czyl dla danych, dla których mplementaca algorytmu mus wykonać nawece operac znaczacych, 2. w przypadku optymstycznym, czyl gdy dane weścowe mnmalzua lczbe potrzebnych operac znaczacych. Cekawostka Celowość przeprowadzena badana przypadków pesymstycznych optymstycznych pozostae przeważne poza dyskusa. Czasem także bada se tzw. z lożoność czasowa oczekwana (średna), zak ladaac, że dane maa np. tzw. rozk lad ednostany (w naszym przypadku znaczy loby to, że prawdopodobeństwo poawena se każde możlwe permutac cagu weścowego est take samo). Oczywśce watplwośc może tuta budzć, czy tak dobór rozk ladu est adekwatny, s lowem czy rzeczywśce modelue to, co zdarza se w praktyce. Ne zmena to ednak faktu, że est to zagadnene bardzo cekawe warte rozważana. Wymaga ono ednak dość rozbudowanego aparatu matematycznego, którym nestety eszcze ne dysponuemy. Netrudno zauważyć, że w przypadku przedstawonych wyże mplementac algorytmów przypadkem optymstycznym est tablca uż posortowana (np. (1, 2, 3, 4, 5)), a przypadkem pesymstycznym tablca posortowana odwrotne (np. (5, 4, 3, 2, 1)). Pozostae nam uż tylko wyróżnć, co możemy rozumeć w danych przyk ladach za operace znaczace oraz dokonać stosowne oblczena. Wydae se, że narozsadne bedze rozważyć lczbe potrzebnych przestaweń elementów oraz lczbe ch porównań rzecz asna, w zależnośc od n. 1. Analza lczby porównań elementów. 1. Sortowane przez wybór. Zauważamy, że lczba porównań ne est zależna od wstepnego uporzadkowana elementów tablcy. Jest ona zawsze równa (n 1) + (n 2) + + 1 = n(n 1)/2 = n 2 /2 n/2. Ostatna aktualzaca: 5 grudna 2012 r.

4.2. PROSTE ALGORYTMY SORTOWANIA TABLIC 25 2. Sortowane babelkowe. Jak wyże, lczba porównań ne est zależna od wstepnego uporzadkowana elementów tablcy. Uzyskuemy wartość (n 1) + (n 2) + + 1 = n 2 /2 n/2. Obydwe mplementace algorytmów ne różna se lczba potrzebnych porównań. Sa zatem tak samo dobre (badź tak samo z le) pod wzgledem tego kryterum. Zauważmy, że lczba ta est proporconalna do n 2 (nacze est rzedu n 2 ). 2. Analza lczby przestaweń elementów. 1. Sortowane przez wybór. (a) Przypadek pesymstyczny. Lczba potrzebnych przestaweń wynos n 1. (b) Przypadek optymstyczny. Lczba potrzebnych przestaweń wynos 0. 2. Sortowane babelkowe. (a) Przypadek pesymstyczny. Lczba potrzebnych przestaweń wynos n(n 1)/2. (b) Przypadek optymstyczny. Lczba potrzebnych przestaweń wynos 0. Okazue se, że w nagorszym przypadku lczba potrzebnych przestaweń elementów dla nasze mplementac algorytmu sortowana przez wybór est proporconalna do n, a dla sortowana babelkowego est aż rzedu n 2! Tablca 4.1 zestawa lczbe potrzebnych przestaweń elementów powyższych algorytmów uzyskane na komputerze autora nneszego opracowana czasy dza lana (w sekundach, tablce o elementach typu nt). Zauważamy, że użyce powyższych algorytmów uż dla n > 100000 ne est dobrym pomys lem (na szcześce, stnea lepsze, naprawde szybke sposoby rozwazana problemu sortowana). Ponadto, sama lczba przestaweń ne t lumaczy czasu wykonana oblczeń (dlatego koneczne by lo także zbadane lczby potrzebnych porównań). Tab. 4.1. Porównane lczby potrzebnych przestaweń elementów czasów dza lana dwóch algorytmów sortowana w przypadku pesymstycznym Lczba przestaweń Czas [s] n Selecton Bubble Selecton Bubble 100 99 4950 0.01 0.01 1000 999 499500 0.01 0.01 10000 9999 49995000 0.05 0.10 100000 99999 4999950000 6.02 10.31 1000000 999999 499999500000 631.38 1003.60 Ostatna aktualzaca: 5 grudna 2012 r.