podstawowe algorytmy sortowania - Insertion, Selection(iteracyjne)
Transkrypt
podstawowe algorytmy sortowania - Insertion, Selection(iteracyjne)
10/26/2016 Przygotować implementację omawianych algorytmów sortowania Insert, Select, Merge a także biblioteczna funkcję sort() w zastosowaniu do zmiennych typu <string>, przy czym dla każdej zastosowanej pętli podać jej niezmiennik (w komentarzu do linii rozpoczynającej pętle) w funkcji main() zaprojektować test poprawności implementacji przy obsłudze funkcji main() wykorzystać co najmniej jedno makro z parametrem 1 wstawianie Kolejno rozsuwamy ułożone już dane tak, aby właściwie umieścić następną daną 8 Ułożone wartości 11 5 2 13 1 6 key= 12 8 Wartość aktualnie przetwarzana ALG:2 1 10/26/2016 wstawianie 5 6 11 12 8 2 13 1 Po czwartej iteracji prawdą jest, że • elementy t[1],t[2],t[3], t[4] są dobrze uporządkowane • nie zgubiliśmy żadnego elementu tablicy 8 niezmienniki pętli Ogólnie można powiedzieć, że: • po każdej kolejnej iteracji obszar uporządkowania poszerza się o 1 pozycję. • każda iteracja jest permutacją elementów tablicy Przypomnienie ( patrz KA Ross i ChRB Wright Matematyka Dyskretna, PWN 1996, str.205 ) Definicja: Powiemy, że zdanie p jest niezmiennikiem pętli while g do S jeśli zdanie p spełnia następujący warunek: Jeśli zdania p i g są prawdziwe zanim wykonamy kroki S, to zdanie p będzie prawdziwe po wykonaniu S ALG:5 wstawianie ALG:6 2 10/26/2016 Twierdzenie o niezmienniku pętli: Przypuśćmy, że zdanie p jest niezmiennikiem pętli while g do S oraz ,że zdanie p jest prawdziwe kiedy wchodzimy do pętli. Wtedy zdanie p jest prawdziwe po każdej iteracji pętli. Jeśli pętla kończy się, to po jej zakończeniu zdanie p jest prawdziwe a zdanie g jest fałszywe. // A[1],…,A[j-1] są uporządkowane. // A[1],…,A[n] są permutacją zbioru wyjściowego // A[i+1],…,A[j] są większe niż key oraz i>0 ALG:7 wybieranie j=0 5 12 6 11 8 2 13 1 8 MAX j=1 13 12 6 11 8 2 5 1 8 Kolejno odnajdujemy element największy w danych i zamieniamy go z elementem z aktualnej pozycji MAX j=2 13 12 6 11 8 2 5 1 8 MAX j=3 13 12 11 6 8 2 5 1 8 ALG:8 3 10/26/2016 wybieranie j=3 Niezmiennik pętli 13 12 11 6 8 2 5 1 8 • po j-tym kroku j największych elementów jest na swoich miejscach; • ciąg t[1],.... ,t[n] jest permutacją ciągu wejściowego; // j najmniejszych elementów jest na swoich miejscach // A[1],…,A[n] są permutacją zbioru wyjściowego // A[smallest] najmniejszy element spośród //A[j+1],…, A[i-1], i <= n ALG:9 Metoda dziel i zwyciężaj: ALG:10 4 10/26/2016 ALG:11 Zmienna referencyjna (referencja) : alias, czyli inna nazwa zmiennej już istniejącej. alternatywa dla wskaźników przy przetwarzaniu zmiennych złożonych w funkcji rodzaj stałego wskaźnika do zmiennej, powiązanie jest na stałe Dostęp funkcji do wartości zmiennej Dostęp funkcji do pamięci gdzie przechowywana jest zmienna C++:12 5 10/26/2016 Tworzenie referencji ( NOWE ZNACZENIE „ &” ): int pies; int & zwierze = pies; // to nie operator adresu, ale identyfikator typu Obie nazwy : zwierze i pies odnoszą się do tej samej zmiennej, tego samego fragmentu pamięci. Powiązanie obu zmiennych jest trwałe. Uwagi i praktyczne rady: • • Deklarując referencje trzeba ją ZAINICJOWAĆ. • Klasyczna praktyką C++ jest przekazywanie do funkcji obiektów przez referencje. • Ostrożnie ze zwracaniem referencji! Unikać zwracania referencji do obszaru pamięci, który jest zwalniany po wykonaniu danej funkcji. Kiedy tylko można formalne parametry referencyjne należy deklarować jako stałe const , aby zabezpieczyć się przed niepożądaną zmianą zawartości zmiennej. C++:13 #define służy definiowaniu stałych definiowaniu makrodefinicji Przykłady: #define ROZMIAR 100 #define NAPIS_1 "Tablica przed sortowaniem\n„ #define MIN( X, Y) { ( ( (X) < (Y) ) ? (X) : else (Y) ) } #define NAPIS_2( SORT ) {cout << "Po " << (SORT) << endl; } #define SORTUJ( ALGORYTM , NAPIS ) { \ (ALGORYTM)(tablica); \ NAPIS_2( (NAPIS) ); \ } Uwaga, co wyświetli następujący kod : #include <iostream> #define SZESC 1+5 #define DZIEWIEC 8+1 #define MNOZENIE_1(a,b) a * b #define MNOZENIE_2(a,b) (a) * (b) int main() { std::cout << "Sześć razy dziewięć równa się: " << MNOZENIE_1(SZESC, DZIEWIEC) << std::endl; std::cout << "Sześć razy dziewięć równa się: " << MNOZENIE_2(SZESC, DZIEWIEC) << std::endl; return 0; } C++:14 6