Transcript Krok 1.

Algorytmy sortowania
i przeszukiwania
Spis treści
1. Sortowanie przez wstawianie - InsertSort
2. Sortowanie przez wybór – SelectionSort
3. Algorytm sortowania bąbelkowego
4. Rekurencja
5. Szybkie sortowanie - quicksort
Sortowanie przez wstawianie - InsertSort
Metoda sortowania przez wstawianie używana jest najczęściej przez
osoby grające w karty.
Polega ona na założeniu, że w danym momencie w ręku trzymamy
jednocześnie karty posortowane i nieposortowane.
W celu realizacji zadania porządkowania należy pobrać ze sterty kart do
posortowania kartę i wstawienia jej na odpowiednie miejsce w obszarze
kart posortowanych.
3
4
7
Karty posortowane
6
8
1
Karty do posortowania
Sortowanie przez wstawianie - InsertSort
Dane: n - liczba elementów w sortowanym zbiorze, d[ ] – zbiór, który
będzie sortowany.
Wynik: Uporządkowany zbiór d[ ]
Algorytm: porządkowanie przez wstawianie– InsertSort
Krok 1. Dla i = 1, 2, ..., n – 1 wykonaj kroki 2 … 4, a następnie zakończ
algorytm
Krok 2. x ← d[j]; i ← j + 1
Krok 3. Dopóki ( i ≤ n ) ∧ ( x > d[i] ): wykonuj d[i - 1] ← d[i]; i ← i + 1
Krok 4 d[i - 1] ← x
Sortowanie przez wstawianie - InsertSort
for(j = n - 2; j >= 0; j--)
{
x = d[j];
i = j + 1;
while((i < n) && (x > d[i]))
{
d[i - 1] = d[i];
i++;
}
d[i - 1] = x;
}
Sortowanie przez wstawianie - InsertSort
Wnioski:
- algorytm ten jest bardzo kosztownym algorytmem
(klasa złożoności obliczeniowej – O(N2)
- nie nadaje się do porządkowania dużych zbiorów
- postać algorytmu przejrzysta
- algorytm krótki
Sortowanie przez wybór - SelectionSort
Metoda porządkowania przez wybór polega na porządkowaniu zbioru
w sposób rosnący tzn. element najmniejszy powinien znaleźć się na
pierwszej pozycji. Metoda ta polega na znalezieniu w zbiorze elementu
najmniejszego i wymienieniu go z elementem na czytanej pozycji zbioru
aż do całkowitego jego uporządkowania.
Zbiór nieuporządkowany
Etapy porządkowania
4
7
2
9
3
4
7
2
9
3
2
7
4
9
3
2
7
4
9
3
2
3
4
9
7
2
3
4
9
7
2
3
4
9
7
2
3
4
9
7
2
3
4
7
9
Sortowanie przez wybór - SelectionSort
Dane: n - liczba elementów zbioru,
d[ ] – zbiór sortowany. Elementy zbioru mają indeksy od 1 do n.
Wynik: Uporządkowany zbiór d[ ]
Algorytm: porządkowanie przez wybór – Selection Sort
Idea: najmniejszy wśród nieuporządkowanych daj na początek
Krok 1. Dla j = 1, 2, ..., n - 1: wykonuj Krok 1 ...Krok 4, a następnie
zakończ algorytm
Krok 2. pmin ← j
Krok 3. Dla i = j + 1, j + 2, ..., n: jeśli d[i] < d[pmin], to pmin ← i
Krok 4. d[j] ↔ d[pmin]
Sortowanie przez wybór - SelectionSort
for(j = 0; j < N - 1; j++)
{
pmin = j;
for(i = j + 1; i < N; i++)
{
if(d[i] < d[pmin]) pmin = i;
}
swap(d[pmin], d[j]);
}
Sortowanie przez wybór - SelectionSort
Wnioski:
- algorytm ten jest bardzo kosztownym algorytmem
(klasa złożoności obliczeniowej – O(N2)
- nie nadaje się do porządkowania dużych zbiorów
- wykonuje taką samą ilość operacji porównania dla zbiorów
częściowo uporządkowanych jak i dla zbiorów
nieuporządkowanych
- algorytm przejrzysty, zwięzły
Algorytm sortowania bąbelkowego
Metoda porządkowania bąbelkowego swoją nazwę wzięła od
pęcherzyków powietrza ulatujących w górę tuby wypełnionej wodą.
Metoda ta polega na analizowaniu dwóch sąsiadujących ze sobą
elementów, jeśli nie są one uporządkowane następuje ich zamiana.
Etapy
40
2
2
2
2
2
2
2
40
4
4
4
4
4
39
4
40
6
6
6
6
6
39
6
40
18
18
18
18
6
39
18
40
20
20
4
18
18
39
20
40
39
20
20
20
20
39
39
40
Indeks tablicy
Algorytm sortowania bąbelkowego
Dane: n - liczba elementów zbioru,
d[ ] – zbiór sortowany. Elementy zbioru mają indeksy od 1 do n.
Wynik: Uporządkowany zbiór d[ ]
Algorytm: porządkowanie bąbelkowe
Krok 1. Dla j = n - 1, n - 2, ..., 1: wykonuj K02...K04, zakończ algorytm
Krok 2. p ← 1
Krok 3. Dla i = 1, 2, ..., j: jeśli d[i] > d[i + 1], to d[i] ↔ d[i + 1]; p ← 0
Krok 4. Jeśli p = 1, to zakończ
Algorytm sortowania bąbelkowego
for(j = N - 1; j > 0; j--)
{
p = 1;
for(i = 0; i < j; i++)
{
if(d[i] > d[i + 1])
{
swap(d[i],
d[i + 1]); p = 0;
}
}
if(p) break;
}
Algorytm sortowania bąbelkowego
Wnioski:
- algorytm ten jest bardzo kosztownym algorytmem
(klasa złożoności obliczeniowej – O(N2)
- bardzo prosta i zrozumiała struktura zapisu
- dość często zdarzają się puste przebiegi (brak wykonania
wymiany jeżeli elementu są uporządkowane)
Rekurencja
Rekurencja - jest modą programowania polegająca na wywoływaniu
funkcji programu przez samą siebie .
Przykład:
long int silnia(int x)
{
if (x==0)
{
return 1;
}
else
{
return x * silnia(x-1);
}
}
Szybkie sortowanie - quicksort
Algorytm ten jak sama nazwa wskazuje, poprzez odpowiednią
dekompozycję osiągnął znaczny zysk w szybkości porządkowania
zbiorów.
Metoda szybkiego sortowania podzielona została na dwie części:
• część służąca do właściwego sortowania polegająca na
wywoływaniu samej siebie
• część odpowiadająca za rozdzielenie elementów tablicy
wartości osiowej podziału
P
<P
P
>= P
Szybkie sortowanie - quicksort
29 40 2
1
6
18 20 32 23 34 39 41
29
2
1
6
18 20 23
2
1
40 32 34 39 41
40
6
18 20 23
32 34 39
41
Szybkie sortowanie - quicksort
Oznaczenia:
left – lewy skrajny element
right – prawy skrajny element
p – wartość osiowa
i – zmienna sterująca pętlą
m – poszukiwany indeks komórki tablicy, w której
umieszczamy element osiowy
Szybkie sortowanie - quicksort
void qsort(int* d, int left, int right)
{
if (left < right)
{
int m = left;
for(int i = left+1; i <= right; i++)
if (d[i] < d[left]) swap(d[++m],d[i]);
swap(d[left], d[m]);
qsort(d, left, m-1);
qsort(d, m+1, right);
}
}
Szybkie sortowanie - quicksort
Wnioski:
- dzięki zastosowaniu metody programowania „dziel
i zwyciężaj” algorytm w optymalnie krótkim czasie realizuje
zadanie porządkowania zbiory
(klasa złożoności obliczeniowej – O(N log N)