This shows you the differences between two versions of the page.
sda-ab:laboratoare:03 [2021/01/12 20:53] marina.ciocirlan [**Exemplul 1 - Suma a n numere**] |
sda-ab:laboratoare:03 [2021/03/08 12:46] (current) andreea.udrea [3. Algoritmi de sortare] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 03: Algoritmi de cautare si sortare ===== | + | ===== Laboratorul 2: Algoritmi de cautare si sortare ===== |
====== 1. Obiectivele laboratorului ====== | ====== 1. Obiectivele laboratorului ====== | ||
Line 13: | Line 14: | ||
* Quick Sort | * Quick Sort | ||
+ | Cerinta si structura laboratorului se gaseste in **[[https://github.com/sda-ab/lab-02-tasks|acest link.]]** | ||
====== 2. Introducere ====== | ====== 2. Introducere ====== | ||
Line 20: | Line 22: | ||
**Algoritm** - o procedura / o secventa de pasi care rezolva o problema data intr-un mod repetabil si cu resurse (timp si memorie) finite; primeste un set de date de intrare si returneaza o solutie – set de date de iesire | **Algoritm** - o procedura / o secventa de pasi care rezolva o problema data intr-un mod repetabil si cu resurse (timp si memorie) finite; primeste un set de date de intrare si returneaza o solutie – set de date de iesire | ||
+ | |||
+ | [[https://en.citizendium.org/wiki/Complexity_of_algorithms]] | ||
====== 2.1 Calculul complexităţii algoritmilor ====== | ====== 2.1 Calculul complexităţii algoritmilor ====== | ||
Line 57: | Line 61: | ||
**Cautare liniara/secventiala intr-o multime neordonata** | **Cautare liniara/secventiala intr-o multime neordonata** | ||
- | Se presupune dat un vector neordonat => trebuie parcurs tot vectorul ca sa vedem daca elementul se gaseste acolo sau nu | + | |
+ | Se presupune dat un vector neordonat. Este necesara parcurgerea intregului vector pentru a verifica unde se gaseste elementul. | ||
<code> | <code> | ||
Line 69: | Line 74: | ||
- | <note>cazul cel mai nefavorabil - algoritmul examineaza n numere pentru cautare (fara succes); cazul mediu - sunt evaluate aproximativ n/2 numere pentru cautarea cu succes. | + | <note>cazul cel mai nefavorabil - algoritmul examineaza n numere pentru cautare (fara succes); |
+ | cazul mediu - sunt evaluate aproximativ n/2 numere pentru cautarea cu succes; | ||
Complexitatea din punct de vedere al duratei este O(n); | Complexitatea din punct de vedere al duratei este O(n); | ||
Complexitatea din punct de vedere al memoriei este O(1) – nu mai trebuie alte resurse fata de datele initiale </note> | Complexitatea din punct de vedere al memoriei este O(1) – nu mai trebuie alte resurse fata de datele initiale </note> | ||
Line 75: | Line 81: | ||
**Cautare binara** | **Cautare binara** | ||
- | Se considera vectorul sortat. Cautarea se face impartind, la fiecare pas, domeniul de cautare in doua – si se selecteaza cel care contine elementul de interes | + | Se considera vectorul sortat. Cautarea se face impartind, la fiecare pas, domeniul de cautare in doua parti si se selecteaza cel care contine elementul de interes |
<code> | <code> | ||
Line 91: | Line 97: | ||
- | <note>Cel mai nefavorabil caz - nu se examineaza mai mult de logn+1 numere => O(logN) | + | <note>Cel mai nefavorabil caz - nu se examineaza mai mult de logn+1 numere acest lucru duce catre o complexitate de O(logN) |
Complexitatea spatiala este O(1) | Complexitatea spatiala este O(1) | ||
</note> | </note> | ||
Line 97: | Line 103: | ||
====== 3. Algoritmi de sortare ====== | ====== 3. Algoritmi de sortare ====== | ||
- | Numim **sortare** orice aşezare(sau - mai clar - reaşezare) a unor elemente date în aşa fel încât, după aşezare, să existe o ordine completă în funcţie de un atribut(numit cheie) al elementelor. | + | Numim **sortare** orice aşezare a unor elemente date în aşa fel încât, după aşezare, să existe o ordine completă în funcţie de un atribut(numit cheie) al elementelor. |
Pentru a exista o ordine completă, trebuie să alegem o relaţie pe care vrem sa o impunem. Dacă relaţia este valabilă între oricare două elemente pentru care primul element este aşezat la stânga celui de-al doilea, atunci avem o ordine completă. | Pentru a exista o ordine completă, trebuie să alegem o relaţie pe care vrem sa o impunem. Dacă relaţia este valabilă între oricare două elemente pentru care primul element este aşezat la stânga celui de-al doilea, atunci avem o ordine completă. | ||
Line 168: | Line 174: | ||
**Descriere :** | **Descriere :** | ||
- | Acest algoritm selectează, la fiecare pas i, cel mai mic element din vectorul nesortat(de la poziţia i până la n).Valoarea minimă găsită la pasul i este pusă în vector la poziţia i,facându-se intereschimbarea cu poziţia actuală a minimului.Nu este un algoritm indicat pentru vectorii mari, în majoritatea cazurilor oferind rezultate mai slabe decât insertion sort şi bubble sort. | + | Acest algoritm selectează, la fiecare pas i, cel mai mic element din vectorul nesortat(de la poziţia i până la n). Valoarea minimă găsită la pasul i este pusă în vector la poziţia i, facându-se intereschimbarea cu poziţia actuală a minimului. Nu este un algoritm indicat pentru vectorii mari, în majoritatea cazurilor oferind rezultate mai slabe decât insertion sort şi bubble sort. |
**Implementare** | **Implementare** | ||
Line 204: | Line 210: | ||
Descriere : | Descriere : | ||
- | Spre deosebire de alţi algoritmi de sortare, sortarea prin inserţie este folosită destul de des pentru sortarea tablourilor cu număr mic de elemente. De exemplu, poate fi folosit pentru a îmbunătăţi rutina de sortare rapidă. | + | Spre deosebire de alţi algoritmi de sortare, sortarea prin inserţie este folosită destul de des pentru sortarea tablourilor cu număr mic de elemente. |
Sortarea prin inserţie seamană oarecum cu sortarea prin selecţie. Tabloul este împărţit imaginar în două părţi - o parte sortată şi o parte nesortată. La început, partea sortată conţine primul element al tabloului şi partea nesortată conţine restul tabloului. | Sortarea prin inserţie seamană oarecum cu sortarea prin selecţie. Tabloul este împărţit imaginar în două părţi - o parte sortată şi o parte nesortată. La început, partea sortată conţine primul element al tabloului şi partea nesortată conţine restul tabloului. | ||
La fiecare pas, algoritmul ia primul element din partea nesortată şi il inserează în locul potrivit al părţii sortate. | La fiecare pas, algoritmul ia primul element din partea nesortată şi il inserează în locul potrivit al părţii sortate. | ||
- | Când partea nesortată nu mai are nici un element, algoritmul se opreste. | + | Când partea nesortată nu mai are niciun element, algoritmul se opreste. |
**Implementare** | **Implementare** | ||
Line 237: | Line 243: | ||
**Descriere :** | **Descriere :** | ||
- | În cazul sortării prin interclasare, vectorii care se interclasează sunt două secvenţe ordonate din acelaşi vector. Sortarea prin interclasare utilizează metoda Divide et Impera: | + | În cazul sortării prin interclasare, vectorii care se interclasează sunt două secvenţe ordonate din acelaşi vector. Sortarea prin interclasare utilizează metoda Divide et Impera: se împarte vectorul în secvenţe din ce în ce mai mici, astfel încât fiecare secvenţă să fie ordonată la un moment dat şi interclasată cu o altă secvenţă din vector corespunzătoare. Practic, interclasarea va începe când se ajunge la o secvenţă formată din două elemente. Aceasta, odată ordonată, se va interclasa cu o alta corespunzătoare(cu 2 elemente). Cele două secvenţe vor alcătui un subşir ordonat din vector mai mare(cu 4 elemente) care, la rândul lui, se va interclasa cu un subşir corespunzător(cu 4 elemente) ş.a.m.d. |
- | se împarte vectorul în secvenţe din ce în ce mai mici, astfel încât fiecare secvenţă să fie ordonată la un moment dat şi interclasată cu o altă secvenţă din vector corespunzătoare. | ||
- | practic, interclasarea va începe când se ajunge la o secvenţă formată din două elemente. Aceasta, odată ordonată, se va interclasa cu o alta corespunzătoare(cu 2 elemente). Cele două secvenţe vor alcătui un subşir ordonat din vector mai mare(cu 4 elemente) care, la rândul lui, se va interclasa cu un subşir corespunzător(cu 4 elemente) ş.a.m.d. | ||
+ | Subvectorii sortaţi sunt interclasaţi succesiv, ı̂n ordinea inversă divizarii, obţinând ı̂n final vectorul sortat. | ||
+ | Iată un exemplu pentru vectorul [38, 27, 43, 3, 9, 82, 10]: | ||
+ | |||
+ | {{ :sda-ab:laboratoare:screenshot_from_2021-01-12_21-59-59.png?450 |}} | ||
**3.5 Quick sort** | **3.5 Quick sort** | ||
Line 250: | Line 258: | ||
**Descriere :** | **Descriere :** | ||
- | Quick Sort este unul dintre cei mai rapizi şi mai utilizaţi algoritmi de sortare până în acest moment,bazându-se pe tehnica „Divide et impera“.Deşi cazul cel mai nefavorabil este O(N^2), în practică, QuickSort oferă rezultate mai bune decât restul algoritmilor de sortare din clasa „O(N log N)“. | + | Quick Sort este unul dintre cei mai rapizi şi mai utilizaţi algoritmi de sortare până în acest moment, bazându-se pe tehnica „Divide et impera“. Deşi cazul cel mai nefavorabil este O(N^2), în practică, QuickSort oferă rezultate mai bune decât restul algoritmilor de sortare din clasa „O(N log N)“. |
Algoritmul se bazează pe următorii paşi: | Algoritmul se bazează pe următorii paşi: | ||
* alegerea unui element pe post de pivot | * alegerea unui element pe post de pivot | ||
- | * parcurgerea vectorului din două părţi(de la stânga la pivot, de la dreapta la pivot, ambele în acelaşi timp) | + | * mutarea elementelor cu valori mai mici decat pivotul inaintea acestuia si a celor mai mari dupa pivot; stabilirea pozitiei finale a pivotului |
- | * interschimbarea elementelor care se află pe „partea greşită“ a pivotului(mutăm la dreapta pivotului elementele mai mari, la stânga pivotului elementel mai mici) | + | * după ce mutăm elementele pe „partea corectă“ a pivotului, avem 2 subşiruri de sortat, pentru fiecare repetam procedura de mai sus. |
- | * divizarea algoritmului: după ce mutăm elementele pe „partea corectă“ a pivotului, avem 2 subşiruri de sortat, iar pivotul se află pe poziţia bună. | + | |
+ | ====== 4. Exercitii propuse====== | ||
+ | 1. Alegeţi un algoritm A(dintre Bubble, Insertion şi Selection) şi un algoritm B(dintre Merge şi Quick). Introduceţi variabile globale cu care să contorizaţi numărul de comparaţii pentru algoritmii A şi B. Comparaţi rezultatele pentru un vector de întregi de lungime n = 20. | ||
- | ====== 4. EXercitii ====== | + | 2. Implementaţi un algoritm(dintre Bubble, Insertion şi Selection) pentru sortarea unui vector cu n cuvinte de maxim 4 litere fiecare. |
- | E0. Alegeţi un algoritm A(dintre Bubble, Insertion şi Selection) şi un algoritm B(dintre Merge şi Quick). Introduceţi nişte variabile globale cu care să contorizaţi numărul de comparaţii pentru algoritmii A şi B. Comparaţi rezultatele pentru un vector de întregi de lungime n = 20. | + | |
- | E1. Implementaţi un algoritm(dintre Bubble, Insertion şi Selection) pentru sortarea unui vector cu n cuvinte de maxim 4 litere fiecare. | + | 3. Implementaţi un algoritm(dintre Merge şi Quick) pentru sortarea unui vector de cu inregistrari de tip ora_exacta, unde structura ora_exacta are campurile intregi: ora, min,sec. |
- | E2. Implementaţi un algoritm(dintre Merge şi Quick) pentru sortarea unui vector de structuri, unde fiecare structură reprezintă un moment de timp(int ora,min,sec). | + | 4. Considerăm un pachet de cărţi. Extragem random n cărţi. Sortaţi aceste cărţi folosind metoda inserţiei. |
+ | 5. Scrieţi un program eficient care să afişeze primele k cele mai mari elemente dintr-un vector. Elementele nu | ||
+ | sunt ordonate, ci ordinea lor este una aleatoare. De exemplu dat vectorul v = [1, 23, 12, 9, 30, 2, 50], dacă k = 3, vrem cele mai mari 3 elemente care sunt 50, 30, 23 | ||