Anda di halaman 1dari 3

Wykad 3

Sortowania szybkie
Sortowanie grzebieniowe Combsort: - pochodzi z roku 1991, - oparta na metodzie bbelkowej, - wczono tutaj empiri (wspczynnik 1.3 wyznaczono dowiadczalnie), - zoono O(n*log(n)), statystyka gorsza ni Quicksort (1.5 - 2 razy), ale algorytm prosty (bez rekurencji).

Metody szybkie
Sortowanie grzebieniowe (combsort) Sortowanie przez podzia (quicksort) Sortowanie przez scalanie (mergesort)

Metody liniowe
Sortowanie licznikowe (countsort) Sortowanie kubekowe

Sortowania szybkie cd.


Warianty sortowania Comsort: - podstawowy - za rozpito przyjmij dugo tablicy, podziel rozpito przez 1.3, odrzu cz uamkow, bdzie to pierwsza rozpito badanych par obiektw, badaj wszystkie pary o tej rozpitoci, jeeli naruszaj monotoniczno, to przestaw; wykonuj w ptli (rozpito podziel znw przez 1.3); kontynuujc do rozpitoci 1 przejdziesz na metod bbelkow; kontynuuj do uzyskania monotonicznoci. - Combsort 11 - rozpito 9 i 10 zastpujemy 11.
3

Sortowania szybkie I cd.


void Combsort(int a[]; int n) { int top, gap, i, j; int tmp; bool swapped=false; gap = n; while (gap>1 || swapped) { gap = max((int)(gap/1.3),1); top = n - gap; swapped = false; for (i=0; i<top; i++) { j = i + gap; if (a[i]>a[j]) { tmp=a[i]; a[i]=a[j]; a[j]=tmp; } swapped = true; } } }
4

Sortowania szybkie I cd.


procedure Combsort(var a:tablica; n:integer); var top, gap, i, j : integer; x : element; swapped : boolean; begin gap := n; repeat gap := max(trunc(gap/1.3),1); top := n - gap; swapped := false; for i := 1 to top do begin j := i + gap; if a[i] > a[j] then begin a[i] :=: a[j]; swapped := true; end; end; until (gap = 1) and not swapped; end;

Sortowania szybkie II
Sortowanie przez podzia Quicksort
- wybieramy element dzielcy, wzgldem ktrego dzielimy tablic na elementy mniejsze i wiksze, wymieniajc elementy pooone daleko od siebie, operacj powtarzamy dla obu czci tablicy, a do podziau na czci o dugoci 1. - wersja rekurencyjna i nierekurencyjna, - warianty: naiwny, losowy, z median z 3, - kombinacja z metod prost, - Quickersort,

Sortowania szybkie II cd.


Sortowanie szybkie cd.
- w zalenoci od wyboru elementu dzielcego rne dziaanie dla skrajnych przypadkw: mediana najmniejsza liczba porwna; mediana z prbki - nie wpywa na wydajno; losowy wybr - rednia efektywno mniejsza od optymalnej; lewy, prawy - zy dla posortowanych rodkowy, - wady i zalety: dla duych n, mona atwo czy z innymi, moe si ukwadratowi - O(n2)! (zy wybr ograniczenia), niestabilna, najszybsza metoda oparta o porwnywanie kluczy.
7

Sortowania szybkie II cd.


int a[MAX]; void qs(l, p : integer) { int i,j,x,tmp; i=l; j=p; x=a[(l+p)/2]; while (i<=j) { while (a[i] < x) do i++; while (a[j] > x) do j--; if (i<=j) { tmp=a[j]; a[j]=a[i]; a[i]=tmp; i++; j--; } } if (l < j) qs(l, j); if (i < p) qs(i, p); }
8

Sortowania szybkie II cd.


procedure sortowanieszybkie; procedure sortuj(l, p : integer); var i,j : integer; x : integer; begin i := l; j := p; x := a[(l+p) div 2]; repeat while a[i] < x do i := i+1; while a[j] > x do j := j-1; if i <= j then begin a[j] :=: a[i]; i := i+1; j := j-1; end; until i > j; if l < j then sortuj(l, j); if i < p then sortuj(i, p); end; begin sortuj(1, n); end;

Wyszukiwanie mediany na bazie sortowania szybkiego

Algorytm poszukiwania mediany: - oglnie znajdowanie k-tego co do wielkoci elementu z n elementowego zbioru, - mediana: w cigu posortowanym jest to element rodkowy; dla mediany k = n / 2, - algorytm Hoare'a: dziaa w miejscu, jest szybki dla danych losowych, pesymistyczna zoono O(n2).

10

Sortowania szybkie III


Sortowanie przez scalanie - Mergesort - jest to metoda ekstensywna o zapotrzebowaniu na dodatkow pami rwn pojemnoci tablicy sortowanej; wyjtkowo dogania Quicksort, statystycznie z nim przegrywa, skomplikowany, dobra idea dla sortowania zewntrznego, - algorytm scalania: dane dwa piki (tablice) monotoniczne, naley je scali w jeden monotoniczny: bierz obiekty z czoa i mniejszy przenie na plik kocowy, konkatenuj, a ktry z plikw wejciowych si skoczy, reszt dopisz na koniec wyjciowego pliku,
11

Sortowania szybkie III cd.


Sortowanie Mergesort cd. - wersja podstawowa (iteracyjna): podziel tablic na odcinki 1-elementowe, scalaj 1 z 2, 3 z 4 itd. Przepisujc do drugiej tablicy; potem dwuelementowe odcinki scalaj w 4-elementowe, przepisujc z powrotem do 1-szej tablicy itd. a do odcinka posortowanego o dugoci tablicy, - wersja rekurencyjna: podziel na 2 czci i zastosuj metod Mergesort, wyniki scal; gorsza od podstawowej, - wersja naturalna: zaczyna si od serii naturalnych; kopot z wyznaczeniem granic serii; jest atrakcyjna, gdy tablica jest czciowo posortowana.
12

Sortowanie licznikowe
int A[MAX]; // elementy z zakresu 0..K-1;

Sortowanie licznikowe
type element = 0..K; tablica = array [1..MAX] of element; procedure CountingSort(var A,B:tablica); var i, j : integer; C : array[0..K] of integer; begin for i:=0 to K do C[i]:=0; for j:=1 to MAX do C[A[j]]:=C[A[j]]+1; for i:=1 to K do C[i]:=C[i]+C[i-1]; for j:=MAX downto 1 do begin B[C[A[j]]]:=A[j]; C[A[j]]:=C[A[j]]-1; end; end;

void CountingSort(int A[], int B[]) { int i,j; int C[K]; for (i=0; i<K; i++) C[i]=0; for (j=0; j<MAX; j++) C[A[j]]=C[A[j]]+1; for (i=0; i<K; =++) C[i]=C[i]+C[i-1]; for (j=MAX-1; j>=0; j--) { B[C[A[j]]]=A[j]; C[A[j]]--; } }

13

14

Sortowanie kubekowe
type tablica = array [1..MAX] of element; { element przyjmuje wartoci [0..1) } BucketSort(A) for i:=1 to MAX do { wstaw A[i] do kolejki B[trunc(MAX*A[i])]; for i:=0 to MAX-1 do { posortuj kolejk B[i] } { dokonaj konkatenacji kolejek B[0]...B[MAX-1] }

15