background image

Algorytmy sortowania 

i przeszukiwania

background image

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

background image

Sortowanie przez wstawianie - 
InsertSort

3

4

7

6

8

1

Karty posortowane

Karty do posortowania

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.

background image

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, ..., – 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

background image

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; 
}

background image

Sortowanie przez wstawianie - 
InsertSort

Wnioski:

- algorytm ten jest bardzo kosztownym algorytmem 

  

   (klasa złożoności obliczeniowej – O(N

2

)

- nie nadaje się do porządkowania dużych zbiorów

- postać algorytmu przejrzysta

- algorytm krótki

background image

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

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

Etapy porządkowania

background image

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. 

p

min

 ← j

Krok 3. 

Dla i = j + 1,  j + 2, ..., njeśli d[i] < d[p

min

], to p

min

 ← i

Krok 4. 

d[j] ↔ d[p

min

]

background image

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]);
 }

background image

Sortowanie przez wybór - SelectionSort

Wnioski:

- algorytm ten jest bardzo kosztownym algorytmem 

  

   (klasa złożoności obliczeniowej – O(N

2

)

- 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

background image

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. 

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

Etapy

background image

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

background image

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; 

background image

Algorytm sortowania bąbelkowego

Wnioski:

- algorytm ten jest bardzo kosztownym algorytmem 

  

   (klasa złożoności obliczeniowej – O(N

2

)

- bardzo prosta i zrozumiała struktura zapisu

- dość często zdarzają się puste przebiegi (brak 
wykonania wymiany jeżeli elementu są 
uporządkowane)

background image

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);
   }
}

background image

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

background image

Szybkie sortowanie - quicksort

2
9

4
0

2

1

6

1
8

2
0

3
2

2
3

3
4

3
9

4
1

29

2

1

6

1

8

2

0

2

3

4

0

3

2

3

4

3

9

4

1

2

1

6

1
8

2
0

2
3

40

3
2

3
4

3
9

41

background image

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

background image

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);
   }
}

background image

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)


Document Outline