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

Podobne dokumenty