• Nie Znaleziono Wyników

Wykład 1-dodatek Sortowanie bąbelkowe, Sortowanie przez zliczanie Implementacja w języku C++, oszacowanie czasochłonności

N/A
N/A
Protected

Academic year: 2021

Share "Wykład 1-dodatek Sortowanie bąbelkowe, Sortowanie przez zliczanie Implementacja w języku C++, oszacowanie czasochłonności"

Copied!
1
0
0

Pełen tekst

(1)

Wykład 1-dodatek Sortowanie bąbelkowe, Sortowanie przez zliczanie

Implementacja w języku C++, oszacowanie czasochłonności

Sortowanie bąbelkowe

// Realizacja w C/C++

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

typedef int element;

const long N=20000L;

const int m=10;

inline void zamien(element &a, element &b);

inline void porownaj_zamien(element &a, element &b);

void wypelnij(element t[], long& ile);

void wyswietl(element t[], long ile);

void babelki(element t[], long l, long p);

void main()

{ element * t=new element[N];

long ile=0;

wypelnij(t,ile);

babelki(t,0,ile-1);

wyswietl(t,ile);

getch();

}

(2)

inline void zamien(element &a, element &b) { element pom = a;

a=b;

b=pom;

}

inline void porownaj_zamien(element &a, element &b) { if (b<a) zamien(a,b);

}

void babelki(element t[], long l, long p) { for( long i =l; i<p; i++)

for (long j=l;j<p-i; j++)

porownaj_zamien(t[j], t[j+1]);

}

void wypelnij(element t[], long& ile) { srand(3);

for (long i=0; i<N; i++) t[i]=rand();

ile=N;

}

void wyswietl(element t[], long ile) { for (long i=0; i<ile; i++)

{ printf("%d \n", t[i]);

if (i%20==0) //lub (i%m==0) { char z=getch();

if (z=='k') return; } }

printf("%ld \n", ile);

}

(3)

Badanie czasochłonności algorytmu

Analiza algorytmów polega na określeniu zasobów, jakie są potrzebne do ich wykonania.

Zasobami są:

 czas wykonania

 pamięć

 szerokość kanału komunikacyjnego

 układy logiczne.

Modelem obliczeń jest jednoprocesorowa maszyna z dostępem swobodnym do pamięci (RAM - Random Access Machine). Algorytmy są realizowane jako programy komputerowe, a instrukcje są wykonywane sekwencyjnie.

Czas wykonania jest zależny od rozmiaru danych wejściowych.

Rozmiar danych wejściowych jest zależny od związanego z nimi rozważanego problemu np.:

 sortowanie - liczba danych do posortowania

 mnożenie dwóch liczb - liczba bitów do reprezentowania danych w postaci binarnej

 problemy z danymi w postaci grafów - liczby wierzchołków i krawędzi.

Czas działania algorytmu dla konkretnych danych wejściowych jest wyrażony liczbą wykonanych prostych (elementarnych) operacji lub

„kroków”.

Zakłada się, że operacja elementarna jest maszynowo niezależna. Czas wykonania i-tego wiersza programu wymaga czasu c j.

(4)

Analiza algorytmu sortowania bąbelkowego

Lp Koszt Liczba wykonań

1 for( long i =0; i<N-1; i++) c1 N

2 for (long j=0;j<N-1-i; j++) c2 tj = N – i+1; (N i )

i

N  

1 1

1

3 porownaj_zamien(t[j],t[j+1]); c3 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

4 if (b<a) c4 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

5 zamien(a,b); c5 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

6 {

element pom=a; c6 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

7 a=b; c7 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

8 b=pom;

} c8 tj-1=N-i+1-1=N-i;

(N i}

i N

1 1

T(N)=c1N+ c2 (N i )

i

N  

1 1

1 +

c3 (N i)

i

N

1

1 +c4 (N i)

i

N

1

1 +c5 (N i)

i

N

1

1 +c6 (N i)

i

N

1

1 +c7 (N i)

i

N

1

1 +c8 (N i)

i

N

1

1 =

= c1N + c2 1) 2

) 1 (N(N

+ (c3 + c4 + c5 + c6+ c7+ c8) (N(N21) N) = = c1N + c2

1

2 (N 2 + N) – c2+ (c3 + c4 + c5 + c6+ c7+ c8)

1

2 (N 2 - N) = = N 2 12 (c2 + c3 + c4 + c5 + c6+ c7+ c8) +

N (c1 + 21 c2 - 21 c3 - 21 c4 - 21 c5 - 12 c6 - 21 c7 - 12 c8) - c2

T(N)  c’’ N 2 + c’’’N

Wniosek: Dla dużych N czas wykonania algorytmu sortowania bąbelkowego zależy od kwadratu liczby danych.

(5)

Sortowanie przez zliczanie

// Implemetacja w C/C++

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#include <Math>

#pragma hdrstop

//---

#pragma argsused const long N=8;

const int K=10;

void wyswietl(int t[], long ile);

void zliczanie(int We[], int Wy[], long l, long p);

void main()

{ int We[N]={3,6,4,1,3,4,1,4};

int Wy[N];

long ile=N;

clrscr();

zliczanie(We, Wy, 0L, ile-1);

wyswietl(Wy, ile);

getch();

}

void wyswietl(int t[], long ile) { for (long i=0L; i<ile; i++)

printf("%i \n", t[i]); }

void zliczanie(int We[], int Wy[], long l, long p) { int Cyfry[K], j;

//zerowanie liczników

for (int i= 0; i< K; i++) Cyfry[i] = 0;

//zliczanie elementów z tablicy We w tablicy Cyfry

for (long i = l; i<= p; i++) Cyfry[We[i]]+= 1;

//zliczanie elementów mniejszych oraz równych "i" w tablicy Cyfry

for (long i=1; i<K; i++) Cyfry[i] += Cyfry[i-1];

for (long i=p; i>=l; i--)

/*sortowanie elementów z tablicy We: element We[i] jest indeksem elementu tablicy Cyfry, zawierającego indeks elementu w tablicy Wy, w którym jest wstawiony element We[i]*/

{ j = We[i];

Wy[Cyfry[j]-1] = We[i];

Cyfry[j] -= 1;

} }

(6)

Analiza algorytmu sortowania przez zliczanie

Lp Koszt Liczba wykonań

1 for (int i= 0; i< K; i++) c1 K+1

2 Cyfry[i] = 0; c2 K

3 for (long i = 0; i<= N-1; i++) c3 N+1

4 Cyfry[We[i]]+= 1; c4 N

5 for (long i=1; i<K; i++) c5 K

6 Cyfry[i] += Cyfry[i-1]; c6 K-1

7 for (long i=N-1; i>=0; i--) c7 N+1

8 {

j = We[i]; c8 N

9 Wy[Cyfry[j]-1] = We[i]; c9 N

10 Cyfry[j] -= 1;

} }

c10 N

T(N,K) = (K+1) c1 + K c2 + (N + 1)c3 + N c4 +K c5 + (K-1) c6 + +(N+1) c7 + N c8 + N c9 + N c10 = K (c1 + c2 + c5 + c6) + + N(c3 + c4 + c7 + c8 + c9 + c10 ) + (c1+ c3- c6+ c7 )

T(N, K) = c’ K + c’’ N + c’’’  c’’ N + c ( dla K = 10)

Wniosek: Czas wykonania algorytmu sortowania przez zliczanie jest liniowo zależny od liczby danych wejściowych.

Cytaty

Powiązane dokumenty

Gdy tak się stanie, w ciągu wynikowym będziemy mieli scalone dwa ciągi o liczbie wyrazów będącej sumą elementów ciągów scalanych. Po scaleniu dwóch pierwszych

1/2 Francja Grecja Albania Egipt Cypr Hiszpania Belgia Dania. 1/3 Francja Albania Grecja Egipt Cypr Hiszpania

Oprócz sortowania przez łączenie zstępujące typu „dziel i rządź” istnieje sortowanie wstępujące (nierekurencyjne) typu „łącz i zwyciężaj, które jest

Zastosuj kod programu genTest.cpp do wygenerowania serii liczb wejsciowych. Za pomoca kodu sortTest.cpp utw´orz wzorcowy output posortowanych serii, kod u˙zywa funkcji

Podstawową operacją algorytmu jest scalanie dwóch zbiorów uporządkowanych w jeden zbiór również uporządkowany. Operację scalania realizujemy wykorzystując pomocniczy

Sortowanie takiego pliku kart omawianą metodą polega na tym, że gracz stopniowo dokłada karty do uporządkowanej części kart (początkowo zawierającej jedną kartę)

Jeśli kolumna z wodą jest zamknięta u góry, tak iż powietrze nie może się z niej wydostać, powietrze stopniowo będzie wypełniać jej górną część.. Sortowanie bąbelkowe

Wariant pierwszy tak naprawdę zawęża możliwości sortowania kubełkowego i ma być zrealizowany jako osobny przypadek tylko na potrzeby niniejszego zadania laboratoryjnego w