• Nie Znaleziono Wyników

Ćwiczenie 2 Algorytmy sortowania tablic

N/A
N/A
Protected

Academic year: 2021

Share "Ćwiczenie 2 Algorytmy sortowania tablic"

Copied!
11
0
0

Pełen tekst

(1)

Ćwiczenie 2

Algorytmy sortowania tablic

Sortowanie przez selekcję

1. Algorytm sortowania przez selekcję - poziom konceptualny 1. Wskaż na pierwszy element ciągu N-elementowego

2. Wykonaj, co następuje, N-1 razy

2.1. Weź jako minimum wskazany element ciągu

2.2. Wykonaj, co następuje, na pozostałych elementach ciągu

2.2.1. wyszukaj element najmniejszy wśród pozostałych elementów i wskazanego elementu

2.3. Zamień najmniejszy element z elementem wskazanym 2.4. Wskaż następny element ciągu

2. Algorytm sortowania przez selekcję – poziom projektowy 1. i  1

2. Wykonaj , co następuje, N-1 razy 2.1. min  i

2.2. j  i+1

2.3. Wykonaj, co następuje, N-i razy

2.3.1. jeśli tab[j] < tab[min], to min  j 2.3.2. j  j+1

2.4. pom  tab[i], tab[i]  tab[min], tab[min]  pom 2.5. i  i+1

(2)

Kroki Ciąg wejściowy Min (indeks elementu) i/j 1 2 3 4 5 6 7 8

1 3 6 4 1 3 4 1 4 1

3 6 4 1 3 4 1 4 4

1 6 4 3 3 4 1 4

2 6 4 3 3 4 1 4 2

6 4 3 3 4 1 4 3

6 4 3 3 4 1 4 4

6 4 3 3 4 1 4 7

1 4 3 3 4 6 4

3 4 3 3 4 6 4 3

4 3 3 4 6 4 4

3 4 3 4 6 4

4 4 3 4 6 4 4

4 3 4 6 4 5

3 4 4 6 4

5 4 4 6 4 5

6 4 6 4 6

7 6 4 7

6 4 8

4 6

8 6 8

1 1 3 3 4 4 4 6

Tab.2. Sortowanie przez selekcję

(3)

3. Realizacja w języku C/C++

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <conio.h>

typedef int element;

const long N=20000L;

const int m=10;

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

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

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

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

void main()

{element * t=new element[N];

long ile=0;

wypelnij(t,ile); // ile po zakończeniu funkcji jest równe N-1

selekcja(t,0,ile-1); //0 jest indeksem pierwszego elementu tablicy, ile-1 // równe N-1 jest indeksem ostatniego elementu

wyswietl(t,ile);

getch();

}

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

a=b;

b=pom;

}

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

{ long min=i;

for (long j=i+1;j<=p; j++) if (t[j]<t[min]) min=j;

zamien(t[i],t[min]);

(4)

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

}

(5)

4. Czasochłonność algorytmu L

p Koszt Liczba wykonań

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

{ long min=i; c2 N-1

2 for (long j=i+1;j<=N-1; j++) c3 tj =N - i-1+2=

N-i+1; ( 1)

1 1

N

i

i N

3 if (t[j]<t[min]) c4 tj-1=N-i;

} (

1

1

N

i

i N

4 min=j; c5 tj-1=N-i;

} (

1

1

N

i

i N 5 zamien(t[i],t[min]);

} }

c6 tj-1=N-1

6 element pom=a; c7 tj-1=N-1

7 a=b; c8 tj-1=N-1

8 b=pom c9 tj-1=N-1

T(N)=c1N+ c2 (N-1)+ c3 1( 1)

1

N

i

i

N + (c4 + c5) 1( }

1

N

i

i

N +( c6+c7+c8+ c9)(N-1) = = (c1+ c2)N - c2 + c3 1)

2 ) 1 (N(N

+ (c4 + c5)N22N + ( c6+ c7+ c8+ c9)(N-1) = = (c1 +c2)N - c2- c3+ c3

1

2 (N 2 -N)+ ( c4+ c5 )

1

2 (N 2 -N)+(c6+ c7+ c8+ c9)(N-1)

=

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

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

Wniosek: Dla dużych N czas wykonania algorytmu sortowania przez selekcję zależy od kwadratu liczby danych.

(6)

Algorytm sortowania przez wstawianie

1. Algorytm sortowania przez wstawianie - poziom konceptualny 1. Wyszukaj najmniejszy element w ciągu N-elementowym

2. Zamień element pierwszy z elementem najmniejszym w ciągu 3. Wskaż trzeci element ciągu (prawy element)

4. Wykonaj, co następuje, N-2 razy:

4.1. Weź jako minimum wskazany prawy element ciągu

4.2. Wskaż na element lewy o numerze mniejszym o 1 od wskazanego elementu

4.3. Wykonaj, co następuje, na pozostałych elementach ciągu:

4.3.1. jeśli element lewy jest większy od minimum, ustaw element lewy na miejscu sąsiadującym z nim na prawo, w przeciwnym przypadku przerwij pętlę 4.3 i przejdź do kroku 4.4

4.3.2. wskaż kolejny lewy element ciągu, o numerze o 1 mniejszym od bieżącego

4.4. Wstaw na miejscu bieżącego lewego elementu element wybrany jako minimum

4.5. Wskaż kolejny element prawy ciągu

2. Algorytm sortowania przez wstawianie – poziom projektowy 1. j = wyszukaj_numer_minimum(tab)

2. pom = tab[1], tab[1]  tab[j], tab[j] pom 3. i  3

4. Wykonaj , co następuje, N-2 razy 4.1.min  tab[i], j  i

4.2. Wykonaj, co następuje, dopóki min < tab[j-1]

4.2.1. tab[j] = tab[j-1]

4.2.2. j  j-1 4.3. tab[j]  min 4.4. i  i+1

(7)

Kroki Ciąg wejściowy (Index) min min I/j 1 2 3 4 5 6 7 8

3 6 4 1 3 4 1 4 4 1

1 6 4 3 3 4 1 4 1 1

3/3 1 6 4 3 3 4 1 4 3 4

6 6

4 6 2 4

4/4 1 4 6 3 3 4 1 4 4 3

6 6 4 4

3 4 6 2 3

5/5 1 3 4 6 3 4 1 4 5 3

6 6 4 4

3 4 6 3 3

6/6 1 3 3 4 6 4 1 4 6 4

6 6

4 6 5 4

7/7 1 3 3 4 4 6 1 4 7 1

6 6 4 4 4 4 3 3 3 3

1 3 2 1

8/8 1 1 3 3 4 4 6 4 8 4

6 6

4 6 7 4

1 1 3 3 4 4 4 6

Tab.3. Sortowanie prze wstawianie

(8)

3. Realizacja w C/C++

#include <stdlib.h>

#include <stdio.h>

#include <time.h>

#include <conio.h>

typedef int element;

const long N=20000L;

const int m=10;

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

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

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

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

void main()

{ element * t=new element[N];

long ile=0;

wypelnij(t,ile); // ile po zakończeniu funkcji jest równe N-1

wstawianie(t,0,ile-1); // 0 jest indeksem pierwszego elementu tablicy, ile-1 // równe N-1 jest indeksem ostatniego elementu

wyswietl(t,ile);

getch();

}

void wstawianie(element t[], long l, long p) { int j=l;

for ( long i =j+1; i<=p; i++) if (t[i]<t[j]) j=i;

if (j !=l) zamien(t[l],t[j]);

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

element min=t[i];

while (min<t[j-1]) { t[j]=t[j-1];

j--;

} t[j]=min;

} }

(9)

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

a=b;

b=pom;

}

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

}

(10)

4.Czasochłonność algorytmu

Lp Koszt Liczba wykonań

1 int j=l; c1 1

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

3 if (t[i]<t[j]) c3 N-1

4 j=i; c4 N-1

5 if (j !=0) c5 1

6 zamien(t[0],t[j]); c6 1

7 element pom=a; c7 1

8 a=b; c8 1

9 b=pom; c9 1

10 for (long i=0+2;i<=N-1; i++) c10 N-1

11 { long j=i; c11 N-2

12 element min=t[i]; c12 N-2

13 while (min<t[j-1]) c14 tj=j; 1( )

2

N

j

j N-2(dla danych posortowanych) 14 { t[j]=t[j-1]; c15 tj=j–1;

} 1 (

1

2

N

j

j 0

15 j--;

}

c16 tj=j–1;

} 1

1(

2

N

j

j 0

16 t[j]=min;

}}

c17 N-2

1) Dla dużych N czas wykonania algorytmu sortowania przez wstawianie zależy od kwadratu liczby danych.

T(N)’= c1+ c5+ c6+ c7+ c8+ c9+ c2N+(N-1)( c3 +c4 +c10)+(N-2)(c11 +c12 +c17)+

c14 1( )

2

N

j

j +c15 1( 1}

2

N

j

j +c16 1( 1}

2

N

j

j

= c1+ c5+ c6+ c7+ c8+ c9+ c2N+(N-1)( c3 +c4 +c10)+(N-2)(c11 +c12 +c17)+

c14 2 ) 1 )(

(N N

-c14+ ( c15 + c16)(N 1)(2N 2) =

= c1+ c5+ c6+ c7+ c8+ c9 –(c3 +c4 +c14+ c10+2c11 +2c12 -2c15 -2c16+2c17)+

N (c2+c3+c4+c10+c11+c12+c17)+ N22 (c14+ c15 + c16)-N2 ( c14 +3c15 +3c16) T(N)’  c’’ N 2 + c’’’N

2) Algorytm działa w czasie liniowym dla danych posortowanych

T(N)’’=c1+c5+c6+c7+c8+c9+c2N+(N-1)(c3+c4+c10)+(N-2)(c11+c12+c14+c17)

(11)

T(N)’’  c’’’N

(12)

Zadanie do wykonania

Należy wykonać oszacowanie czasu trwania programu zawierającego pętle, napisanego w ramach laboratorium z języków programowania 1. Sposób obliczania czasu został przedstawiony na przykładzie sortowania przez selekcję, (przez wstawianie), sortowania bąbelkowego (wykład2).

Cytaty

Powiązane dokumenty

(2.2.4) Wyznacz kolejne serie, po jednej o tym samym numerze z każdego niewyczerpanego pliku wejściowego;. (2.3) Zamień pliki wyjściowe

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

Wyznaczenie liczby operacji typu porównania, przypisania, wywołania funkcji, operacji arytmetycznych, wyłuskań występujących przy wstawianiu 1000 danych, zależnych od rozkładu

Zaleca się, aby każdy podprogram posiadał własną planszę (czyli plik o dowolnej nazwie nazwa.lis np.. Plik/Plansza/Nowa i następnie na planszy wywołanej

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

Zastosuj kod programu generatorTest.cpp do wygenerowania serii liczb wejsciowych. Za pomoca kodu wzorcowka.cpp wyprodukuj

Sortowanie w miejscu nie wymaga wykorzystania dodatkowej pamięci zależnej od ilości sortowanych danych, lecz tylko pewną stałą jej ilość.. Sortowanie stabilne zapewnia, iż