AiSD w3 sortowanie1 id 53486 (2)

background image

1

Algorytmy i Struktury Danych

wykład 3

Algorytmy sortowania cz.1

background image

2/31

Definicja sortowania

proces układania, porządkowania

elementów w określonej kolejności,

według określonego kryterium (klucza)

background image

3/31

Definicja sortowania (2)

elementy sortowane:

e

1

, e

2

, e

3

,…,e

i

,…, e

n

operacja sortowania → wyznaczanie permutacji
na obiektach sortowanych do momentu
osiągnięcia ich uporządkowania spełniającego
dla określonej funkcji porządkującej f warunek:

f(e

(1)

)

f(e

(2)

)

f(e

(3)

)

f(e

(i)

)

f(e

(n)

)

background image

4/31

Sortowanie - zastosowanie

jest jednym z ważniejszych i często
spotykanych operacji w przetwarzani danych

sortowanie może być stosowane w celu
łatwiejszego wyszukania lub wybrania
pewnych elementów sortowanych danych

background image

5/31

Ogólny podział metod sortowania

sortowanie wewnętrzne

→ sortowanie tablic,

zwykle przechowywanych w pamięci
operacyjnej komputera, wszystkie elementy
sortowane są widoczne łatwo dostępne

sortowanie zewnętrzne

→ sortowanie plików,

zwykle przechowywanych w pamięci
zewnętrznej komputera, widoczne są tylko
elementy leżące na wierzchu stosu

background image

6/31

Określanie efektywności

algorytmów sortowania

liczba elementarnych operacji, będąca
funkcją liczby sortowanych elementów:

liczba porównań

liczba przesunięć

przykłady klas algorytmów sortowania

O(N

2

) – proste algorytmy, nie nadają się do

sortowania dużych tablic

O(NlogN) – zaawansowane, wykorzystywane
do sortowania dużych tablic

background image

7/31

Porównanie liczby operacji

algorytmów klas N∙logN oraz N

2

0

5000

10000

15000

20000

25000

30000

35000

40000

45000

0

2000

4000

6000

8000

10000

12000

0

20000000

40000000

60000000

80000000

100000000

120000000

NlogN

N2

background image

8/31

Sortowanie „przez wstawianie”

ustawienie indeksu na elemencie o numerze j

przypisanie wartości elementu e(j) do

zmiennej tymczasowej

porównanie wartości tymczasowej e(j) z e(j-1)

jeżeli element e(j-1) > e(j) to:

element e(j-1) staje się elementem e(j)

indeks j zmniejsza się o 1

ponowne sprawdzenie wartości tymczasowej i

elementu e(j-1)

umiejscowienie sprawdzanego elementu

background image

9/31

Sortowanie „przez wstawianie”

2

5

7

4

8

1

9

elementy posortowane

elementy nieposortowane

sortowany element

ostateczna pozycja

sortowanego

elementu

background image

10/31

Sortowanie „przez wstawianie”

void sort_wstaw(int t[],int r)

{

int j,wtemp;

for(int i=0;i<r;i++)

{

j=i; wtemp=t[j];

while(t[j-1]>wtemp && j>0)

{

t[j]=t[j-1];

j--;

}

t[j]=wtemp;

}

}

rozpoczęcie pętli

wartość tymczasowa

porównanie

zamiana

ostateczne umiejscowienie

sprawdzanego elementu

background image

11/31

Sortowanie „przez wstawianie” -

przykład

background image

12/31

Cechy sortowania „przez wstawianie”

prosty zapis w postaci algorytmu

algorytm o dużej złożoności obliczeniowej, klasy
O(N

2

)

liczba porównań i przesunięć może być różna
dla różnych przypadków uporządkowania tablicy
przed sortowaniem

nie nadaje się do sortowania dużych tablic

background image

13/31

Sortowanie bąbelkowe

stanowi analogię tablicy odwróconej o 90

o

do

naczynia z wodą i pęcherzykami powietrza w
wodzie

pęcherzyki powietrza ulatują do góry

im lżejszy pęcherzyk powietrza tym szybciej
ulatuje do góry

background image

14/31

Sortowanie bąbelkowe - przebieg

pierwszym sprawdzanym elementem jest ostatni
element tablicy

w 1. pętli element o najmniejszej wartości (najlżejszy)
przemieszcza się na 1. pozycję

w 2. pętli element najlżejszy z zakresu pomijającego 1.
element przemieszcza się na 2. pozycję tabeli

pojedyncza operacja to porównanie dwóch sąsiednich
elementów

każda pętla operuje na tablicy o 1 element mniejszej →
pomijane posortowane elementy

background image

15/31

Sortowanie bąbelkowe - przykład

10

9

8

7

6

5

4

3

2

1

p9

10

10

10

10

10

10

10

6

6

e10

9

9

9

9

9

9

9

10

3

e9

8

8

8

8

8

8

6

9

10

e8

7

7

7

6

6

6

8

3

9

e7

6

6

6

7

5

5

4

8

1

e6

5

5

5

5

7

4

5

4

8

e5

4

4

4

4

4

7

3

5

4

e4

3

3

3

3

3

3

7

2

5

e3

2

2

2

2

2

2

2

7

2

e2

1

1

1

1

1

1

1

1

7

e1

p8

p7

p6

p5

p4

p3

p2

p1

p0

background image

16/31

Sortowanie bąbelkowe - algorytm

void sort_babelkowe(int t[],int r)

{

int wtemp;

for(int i=0;i<r;i++)

{

for(int j=r-1;j>=i;j--)

if(t[j]<t[j-1])

{

wtemp=t[j-1];

t[j-1]=t[j]; t[j]=wtemp;

}

}

}

ogranicznik sprawdzanych

elementów do nieposortowanych

indeks sprawdzanej pary

nieposortowanego zakresu listy

porównanie pary elementów listy

je

żeli element o większym

indeksie jest mniejszy od

poprzednika to nast

ępuje zamiana

miejsc w li

ście

background image

17/31

Sortowanie bąbelkowe - analiza

często zdarzają się „puste” przebiegi pętli

wrażliwość na ułożenie danych w tablicy

prosty zapis algorytmu

dość duża złożoność obliczeniowa O(N

2

)

background image

18/31

Sortowanie przez wstrząsanie

oparte na sortowaniu bąbelkowym

klasa algorytmu O(N

2

)

zapamiętywany indeks ostatniej zmiany
(w celu uniknięcia pustych przebiegów pętli)

przełączanie kierunku przeglądania tablicy

wymagana mniejsza liczba operacji
porównania/przestawiania elementów

background image

19/31

Sortowanie przez wstrząsanie

void sort_wstrzasanie(int t[],int r)

{

int k,wtemp,left,right;

left=1; right=n-1; k=n-1;

do

{

for(int i=r-1;i>=left;i--)

if(t[i]<t[i-1])

{

wtemp=t[i-1]; t[i-1]=t[i];

t[i]=wtemp; k=i;

}

left=k+1;

for(int i=left;i<=right;i++)

if(t[i]<t[i-1])

{

wtemp=t[i-1];

t[i-1]=t[i];

t[i]=wtemp; k=i;

}

right=k-1;

} while(left<=right);

return;

}

kierunek przesuwania

kierunek przesuwania

background image

20/31

Sortowanie przez wstrząsanie -

przykład

background image

21/31

Sortowanie przez wybieranie

metoda:

wyszukiwany jest element o najmniejszej wartości i

wymieniany z 1. elementem tablicy

operacja powyższa powtarzana jest dla następnych n-1

nieposortowanych obiektów

w danym kroku pod uwagę brane są wszystkie

elementy tablicy wejściowej, aby wyszukać

najmniejszy i wstawić go w odpowiednie miejsce

tablicy wynikowej → odwrotnie niż w metodzie

„przez wstawianie”, gdzie porównuje się jeden

element tablicy źródłowej ze wszystkimi

elementami tablicy wynikowej

background image

22/31

Sortowanie przez wybieranie - przykład

void sort_wybieranie(int t[],int r)

{

int k,wtemp;

for(int i=0;i<r;i++)

{

k=i; wtemp=t[i];

for(int j=i+1;j<n;j++)

if(t[j]<wtemp)

{

k=j; wtemp=t[j];

}

t[k]=t[i]; t[i]=wtemp; wyswietl(t,n);

}

}

rozpocz

ęcie przeszukiwania dla

1. elementu nieposortowanej

cz

ęści tablicy źródłowej

zmienna pomocnicza

wyszukiwanie najmniejszego

elementu tablicy

źródłowej

w

śród pozostałych elementów

zamiana elementów tablicy

indeks najmniejszego elementu

background image

23/31

Sortowanie przez wybieranie - przykład

background image

24/31

Sortowanie przez wybieranie - analiza

liczba porównań Po=0.5(n

2

-n) nie zależy od

początkowego ustawienia elementów tablicy

liczba przesunięć minimalna: Pr

min

=3(n-1)

liczba przesunięć maksymalna:
Pr

max

=trunc(n

2

/4)+3(n-1)

liczba przesunięć średnia: Pr

sr

n(ln(n)+

γ

) gdzie

γ ≈0,577 → stała Eulera

zwykle nieco szybszy od prostego wstawiania

background image

25/31

Quicksort – szybkie sortowanie

jest algorytmem klasy O(NlogN)

jest algorytmem typu rekurencyjnego

przebieg procesu sortowania:

wybór punktu podziału (pivot)

przerzucenie elementów o wartościach

większych od pivota na prawo od niego oraz

elementów o wartościach mniejszych na lewo

od niego

wywołanie rekurencyjne sortowania dla obu

części tabeli

background image

26/31

Quicksort – kod

void sort_szybkie(int t[],int r, int p, int k)

{

int i,j,wtemp,pivot;

i=p; j=k; pivot=t[p];

while(i<j)

{

while(t[i]<pivot) i++;

while(t[j]>pivot) j--;

if(i<=j)

{

wtemp=t[i]; t[i]=t[j]; t[j]=wtemp;

i++; j--;

}

}

if(i<k) sort_szybkie(tab, n, i, k);

if(p<j) sort_szybkie(tab, n, p, j);

}

definicja punktu podzia

łu

wyszukanie pary elementów

ustawionych niepoprawnie

wobec pivota

zamiana pary elementów

ustawionych niepoprawnie

wobec pivota

wywo

łanie rekurencyjne

sortowania cz

ęści tablicy

prawej i lewej

background image

27/31

Quicksort – przykład

7

2

5

4

8

1

9

10

3

6

7

2

5

4

1

3

6

8

9

10

2

1

5

4

3

6

5

4

3

6

punkt podzia

łu

background image

28/31

Quicksort – przykład

background image

29/31

Quicksort – podsumowanie

szybkość wykonania algorytmu jest
uzależniona od wyboru punktu podziału
(pivota)

wybór punktu podziału może być:

losowy

pierwszy element tablicy

środkowy element tablicy

background image

30/31

Quicksort – podsumowanie

jeżeli jako punkt podziału wybrany
zostanie punkt środkowy (mediana) to

liczba porównań = n∙logn

liczba wymian = n/6∙logn

w skrajnie niekorzystnym przypadku
algorytm staje się algorytmem klasy O(N

2

)

quicksort preferuje tablice
nieuporządkowane i złożone

background image

31

Dziękuję za uwagę


Wyszukiwarka

Podobne podstrony:
AiSD w4 sortowanie2 id 53487
AiSD Wyklad4 dzienne id 53497 Nieznany (2)
AiSD Wyklad9 dzienne id 53501 Nieznany
AiSD Wyklad11 dzienne id 53494 Nieznany
AiSD Wyklad6 dzienne id 53499 Nieznany (2)
AiSD w7 8 Sortowanie
AiSD Wyklad7 dzienne id 53500 Nieznany (2)
AiSD Wyklad3 dzienne id 53496 Nieznany (2)
AiSD 2008 01m id 53468 Nieznany (2)
AiSD W3 1
AiSD Wyklad5 dzienne id 53498 Nieznany
AiSD W3
Fizyka W3 W4 id 177236 Nieznany
AiSD w2 rekurencja id 53485
AiSD Wyklad4 dzienne id 53497 Nieznany (2)
PodstEle w3 id 369043 Nieznany
PC w3 id 351840 Nieznany

więcej podobnych podstron