Gabriela Mihai
1. Cutarea binar
Algoritm:
Este un algoritm de cutare folosit pentru a gsi un element ntr-un tablou
unidimensional (vector) ordonat.
Algoritmul funcioneaz pe baza tehnicii divide et impera. Valoarea cutat este
comparat cu cea a elementului din mijlocul vectorului.
Dac este egal cu cea a acelui element, algoritmul se termin.
Dac este mai mare dect acea valoare, algoritmul se reia, de la mijlocul
listei pn la sfrit.
Dac este mai mic dect acea valoare, algoritmul se reia pentru elementele
de la nceputul listei pn la mijloc.
Deoarece la fiecare pas cardinalul mulimii de elemente n care se efectueaz
cutarea se njumtete, algoritmul are complexitate logaritmic.
Exemplu:
Se dau urmtoarele numere: 21, 35, 54, 68, 71, 85 i 97.
a. Se caut numrul 35.
21 35 54 68 71 85 97
21 35 54 68 71 85 97
st mijloc dr
21 35 54 68 71 85 97
st mijloc dr
21 35 54 68 71 85 97
21 35 54 68 71 85 97
st mijloc dr
1
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
21 35 54 68 71 85 97
st mijloc dr
21 35 54 68 71 85 97
dr, st,
mijloc
21 35 54 68 71 85 97
dr st
Problem:
Se d un vector cu n elemente numere ntregi distincte, sortat cresctor. S se
afieze dac un element x, introdus de la tastatur, se gsete n vector.
import java.io.*;
class Caut1
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
if(v[mijloc]==caut)
rezultat=true;
else
if(v[mijloc]<caut)
st= mijloc +1;
else
dr= mijloc -1;
} while (st<=dr && rezultat==false);
return rezultat;
}
3
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
boolean gasit;
//cautare binara iterativa
System.out.println(" ");
System.out.println("Cautare binara iterativa");
gasit=caut_bin_i(caut,v,n);
if (gasit)
System.out.println("Am gasit "+ caut);
else
System.out.println("Nu am gasit " + caut);
Exemplu:
1 12 5 26 7 14 3 7 2 Vector nesortat
1 12 5 26 7 14 3 7 2 Prima trecere, i = 8.
1 12
j j+1 i nu se interschimb
1 12 5 26 7 14 3 7 2
4
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
12 5
j j+1 i se interschimb
1 5 12 26 7 14 3 7 2
12 26
j j+1 i nu se interschimb
1 5 12 26 7 14 3 7 2
26 7
j j+1 i se interschimb
1 5 12 7 26 14 3 7 2
26 14
j j+1 i se interschimb
1 5 12 7 14 26 3 7 2
26 3
j j+1 i se interschimb
1 5 12 7 14 3 26 7 2
26 7
j j+1 i se interschimb
1 5 12 7 14 3 7 26 2
26 2
j i se interschimb
j+1
1 5 12 7 14 3 7 2 26
s-a terminat prima
trecere; ultimul element
j j+1 i este pe poziia final
5
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
1 2 3 5 7 7 12 14 26 Vectorul sortat
Problem:
Se d un vector cu n elemente numere ntregi. S se sorteze cresctor acest tablou
folosind metoda sortrii prin interschimbare direct.
import java.io.*;
class Sort2
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
for (i=0;i<n;i++)
{
System.out.print("v["+i+"]=");
v[i]=getInt();
}
sortare(v, n);
System.out.println(" ");
System.out.println("Vectorul sortat este:");
for (i=0;i<n;i++)
System.out.print(v[i]+" ");
System.out.println(" ");
}
}
Exemplu:
1 12 5 26 7 14 3 7 2 Vector nesortat
1 12 5 26 7 14 3 7 2 Prima trecere, i = 0.
j = 1..8. Nici o
i j j valoare nu este mai
min mic dect minimul.
1 12 5 26 7 14 3 7 2 A doua trecere, i = 1.
i j 12 5
min
1 12 5 26 7 14 3 7 2
min = 5
i min j 5 26
7
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
57
1 12 5 26 7 14 3 7 2
i min j
1 12 5 26 7 14 3 7 2 5 14
i min j
1 12 5 26 7 14 3 7 2 53
min = 3
i min j
1 12 5 26 7 14 3 7 2 37
i min j
1 12 5 26 7 14 3 7 2 32
i min j
1 12 5 26 7 14 3 7 2
min = 2
j Trecerea s-a
i terminat
min
1 12 5 26 7 14 3 7 2
j Schimb 12 cu 2
i
min
1 2 5 26 7 14 3 7 12
8
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
i j A treia trecere, i=2
min
1 2 3 5 7 7 12 14 26 Vectorul sortat
Problem:
Se d un vector cu n elemente numere ntregi. S se sorteze cresctor acest tablou
folosind metoda sortrii prin selecie direct a minimului.
import java.io.*;
class Sort3
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
v[k]=v[i];
v[i]=min;
}
}
9
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
for (i=0;i<n;i++)
{
System.out.print("v["+i+"]=");
v[i]=getInt();
}
sort_selectie_min(v, n);
System.out.println(" ");
System.out.println("Vectorul sortat este: ");
for (i=0;i<n;i++)
System.out.print(v[i]+" ");
System.out.println(" ");
}
}
Exemplu:
1 12 5 26 7 14 3 7 2 Vector nesortat
1 12 5 26 7 14 3 7 2 i=1
aux = 12
inserare element
j i marcat v[1] = aux =
aux 12
1 12 5 26 7 14 3 7 2 i=2
10
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
aux = 5
j i
aux
deplasare la stanga
j=0
j
inserare element
marcat v[1]=aux =5
1 5 12 26 7 14 3 7 2 i=3
aux = 26
j i inserare element
aux marcat v[3]=aux =26
1 5 12 26 7 14 3 7 2 i=4
aux = 7
deplasare element
j i in dreapta
aux v[4]=v[3]=26
1 5 12 26 26 14 3 7 2
deplasare cu o
pozitie la stanga
j i j=2
1 5 12 12 26 14 3 7 2 deplasare element
in dreapta
v[3]=v[2]=12
deplasare cu o
j i pozitie la stanga
j=1
1 5 7 12 26 14 3 7 2 inserare element
marcat
v[2]=aux=7
11
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
1 2 3 5 7 7 12 14 26 Vectorul sortat
Problem:
Se d un vector cu n elemente numere ntregi. S se sorteze cresctor acest tablou
utiliznd metoda sortrii prin inserie direct.
import java.io.*;
class sort4
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
12
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
for (i=0;i<n;i++)
{
System.out.print("v["+i+"]=");
v[i]=getInt();
}
sort_insertie(v, n);
System.out.println(" ");
System.out.println("Vectorul sortat este: ");
for (i=0;i<n;i++)
System.out.print(v[i]+" ");
System.out.println(" ");
}
}
Exemplu
1 12 5 26 7 14 3 7 2 Vector nesortat
1 12 5 26 7 14 3 7 2
Valoare pivot = 7
i pivot j
1 12 5 26 7 14 3 7 2
12 7 2,
i j interschimb 12 cu 2
13
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
1 2 5 26 7 14 3 7 12
26 7 7,
i j interschimb 26 cu 7
1 2 5 7 7 14 3 26 12
7 7 3,
i j interschimb 7 cu 3
1 2 5 7 3 14 7 26 12
1 2 3 5 7 7 12 14 26 Vector sortat
Problem:
Se d un vector cu n elemente numere ntregi. S se sorteze cresctor acest tablou
utiliznd metoda sortrii prin interschimbare folosind partiii (Quicksort).
import java.io.*;
class sort5
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
while (i <= j) {
while (v[i] < pivot)
i++;
while (v[j] > pivot)
j--;
if (i <= j) {
tmp = v[i];
v[i] = v[j];
v[j] = tmp;
i++;
j--;
}
};
return i;
}
for (i=0;i<n;i++)
{
System.out.print("v["+i+"]=");
v[i]=getInt();
}
quicksort(v, 0, n-1);
System.out.println(" ");
System.out.println("Vectorul sortat este: ");
for (i=0;i<n;i++)
System.out.print(v[i]+" ");
System.out.println(" ");
}}
15
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
Exemplu:
1 12 5 26 7 14 3 7 2 Vector nesortat
1 12 5 26 7 14 3 7 2 Increment = 9 / 3 + 1=4
Inc = 4 7<1?
1 12 5 26 7 14 3 7 2
Inc = 4 2 < 7,
interschimb 2 cu 7
1 12 5 26 2 14 3 7 7
Inc = 4 14 < 12 ?
1 12 5 26 2 14 3 7 7
Inc = 4 3 < 5,
interschimb 3 cu 5
1 12 3 26 2 14 5 7 7
1 12 3 7 2 14 5 26 7 Increment = 4 / 3 + 1=2
Inc = 2 3<1?
1 12 3 7 2 14 5 26 7
Inc = 2 2 < 3,
interschimb 2 cu 3
16
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
1 12 2 7 3 14 5 26 7
Inc = 2 5<3?
1 12 2 7 3 14 5 26 7
Inc = 2 7<5?
1 12 2 7 3 14 5 26 7
1 7 2 12 3 14 5 26 7 Recursiv
1 2 3 5 7 7 12 14 26 Vector sortat
Problem:
Se d un vector cu n elemente numere ntregi. S se sorteze cresctor acest tablou
utiliznd metoda sortrii prin inserie cu micorarea incrementului.
import java.io.*;
class sort6
{
//introducere un string de la tastatura
public static String getString() throws IOException
{
InputStreamReader sir=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(sir);
String s=br.readLine();
return s;
}
increment = increment / 3 + 1;
}
insertSort(v, 0, n, 1);
}
public static void insertSort(int v[], int start, int n, int increment)
{
int j, k, temp;
for (i=0;i<n;i++)
{
System.out.print("v["+i+"]=");
v[i]=getInt();
}
18
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
shellsort(v,n);
System.out.println(" ");
System.out.println("Vectorul sortat este: ");
for (i=0;i<n;i++)
System.out.print(v[i]+" ");
System.out.println(" ");
}
}
Definiii:
Un arbore const din noduri care sunt unite prin muchii.
Singurul mod de a ajunge de la un nod la altul este de a urma un drum de-a lungul
muchiilor.
Cale (drum) ne deplasm de la un nod la altul de-a lungul muchiilor prin care
acestea sunt conectate; secvena de noduri rezultat se numete cale.
Rdcin nodul din vrful arborelui.
Printe orice nod (cu excepia rdcinii) are exact o muchie orientat n sus
spre un alt nod. Nodul situat mai sus este numit printele nodului curent.
Fiu orice nod poate avea una sau mai multe muchii orientate n jos, spre alte
noduri. Aceste noduri situate mai jos sunt numite fii nodului curent.
Frunz un nod fr fii.
Subarbore un nod poate fi considerat ca rdcin pentru un subarbore, care
cuprinde fii acelui nod, fii fiilor si etc (pn se ajunge la frunze).
Vizitare un nod este vizitat atunci cnd se execut operaii asupra sa; o simpl
trecere printr-un nod cu scopul de ajunge la alt nod nu este considerat vizitare.
Parcurgere vizitarea tuturor nodurilor din arbore.
- parcurgere n inordine (subarbore stng rdcin subarbore drept)
- parcurgere n preordine (rdcin subarbore stng subarbore drept)
- parcurgere n postordine (subarbore stng subarbore drept rdcin)
Nivel nivelul unui nod este numrul de muchii parcurse pentru a ajunge de la
rdcin la acel nod. Rdcina arborelui este pe nivelul 0, fii acesteia pe nivelul 1
etc.
Cheie valoarea nodului.
Arbore binar - un arbore n care orice nod poate avea cel mult doi fii.
19
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
Exemplu:
10
20 30
50
60 40
90 70 80
10
20 30
50
60 40
90 70 80
(20) 10 (30)
60 90 20 70 40 10 30 80 50
20
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
10
20 30
50
60 40
90 70 80
10 (20) (30)
10 20 60 90 40 70 30 50 80
10
20 30
50
60 40
90 70 80
21
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
(20) (30) 10
90 60 70 40 20 80 50 30 10
Exemplu:
Se d urmtorul ir: 65, 25, 15, 55, 10, 20, 40, 80, 70, 95, 85. S se formeze
arborele binar de cutare asociat acestor numere.
65
65
65
25
25
15
65
65
25
25
15 55
15 55
10
22
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
65
80
25
55 95
15 70
10 20 40 85
Problem:
S se implementeze urmtoarele operaii pentru un arbore binar de cutare:
- inserare nod;
- tergere nod;
- parcurgere n inordine;
- parcurgere n postordine;
- parcurgere n preordine.
import java.io.*;
class Nod
{
int valoare; //informatia din nod
Nod st; //fiul din stanga
Nod dr; //fiul din dreapta
class Arbore
{
private Nod radacina; //primul nod al arborelui
//constructor
public Arbore()
{
radacina=null; //arbore vid
}
23
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
//metoda de cautare
public Nod cauta(int n)
{
Nod curent=radacina;
if(curent==null)
return null;
while(curent.valoare!=n)
{
if (n<curent.valoare) //deplasare la stanga?
curent=curent.st;
else
curent=curent.dr;
if(curent==null) //daca nu exista descendenti
return null; //cheia nu este in arbore
}
return curent;
}
//metoda inserare nod nou
public void insereaza(int n)
{
//creeaza un nou nod
Nod nou=new Nod();
nou.valoare=n;
}
}
}
if(curent==radacina)
radacina=curent.dr;
else
if(t)
parinte.st=curent.dr;
else
parinte.dr=curent.dr;
//dc nodul are 2 fii, atunci se inlocuieste cu succesorul inordine
else
{ //determina succesorul nodului de sters (curent)
Nod succesor=cautaSuccesor(curent);
//succesor devine fiul parintelui lui curent
if(curent==radacina)
radacina=succesor;
else
if(t)
parinte.st=succesor;
else
parinte.dr=succesor;
//subarborele stang al nodului curent este atasat la succesor
succesor.st=curent.st;
}
//succesor nu poate avea subarbore stang
return true;
}
//metoda de parcurgere
public void parcurge(int opt)
{switch(opt)
{case 1: System.out.println("parcurgere in preordine-radacina,st,dr");
preordine(radacina);
26
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
break;
case 2: System.out.println("parcurgere in inordine-st,radacina,dr");
inordine(radacina);
break;
case 3: System.out.println("parcurgere in postordine-st,dr,radacina");
postordine(radacina);
break;
}
System.out.println();
}
//parcurgere in preordine
public void preordine(Nod m)
{if (m!=null)
{m.afiseaza();
preordine(m.st);
preordine(m.dr);
}
}
//parcurgere in inordine
public void inordine(Nod m)
{if (m!=null)
{inordine(m.st);
m.afiseaza();
inordine(m.dr);
}
}
//parcurgere in postordine
public void postordine(Nod m)
{
if(m!=null)
{postordine(m.st);
postordine(m.dr);
m.afiseaza();
}
}
class arbori
{
// introducere string
public static String getString() throws IOException{
InputStreamReader isr=new InputStreamReader(System.in);
BufferedReader br=new BufferedReader(isr);
String s=br.readLine();
return s;
}
// introducere integer
public static int getInt() throws IOException{
String s = getString();
return Integer.parseInt(s);
}
27
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
System.out.println("1.Cautare");
System.out.println(" ");
System.out.println("2.Inserare");
System.out.println(" ");
System.out.println("3.Stergere ");
System.out.println(" ");
System.out.println("4.Parcurgere ");
System.out.println(" ");
System.out.println("5.Exit ");
System.out.println(" ");
boolean var=true;
int opt;
while(var){
System.out.print("Alege optiune ");
opt=getInt();
if(opt!=5)
var=true;
else
var=false;
int nr_i,nr_dupa;
switch(opt)
{
case 1:System.out.print("Dati valoarea cautata: ");
valoare=getInt();
Nod gasit=arb.cauta(valoare);
if(gasit!=null)
System.out.print("Valoare "+valoare+" gasita.");
else
System.out.print("Valoarea nu a fost gasita.");
break;
case 2:System.out.print("Dati valoarea pe care doriti sa o inserati: ");
valoare=getInt();
arb.insereaza(valoare);
break;
case 3:System.out.print("Dati valoarea pe care doriti sa o stergeti: ");
valoare=getInt();
28
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
boolean sters=arb.sterge(valoare);
if(sters)
System.out.println("Valoare "+valoare+" stearsa.");
else
System.out.println("Valaorea nu a fost gasita.");
break;
case 4:System.out.println("Dati valoarea 1(preordine),2(inordine),3(postordine)");
valoare=getInt();
arb.parcurge(valoare);
break;
case 5:System.exit(0);
System.out.println(" ");
break;
}
}
}
}
Exemplu:
Se d un ir de frecvene:
0,3
0,15
S4 0,15
S6 S5 0,15
0,05 0,10
S6 S5
0,05 0,10
29
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
0,3 0,4
S4 S3 S2
0,15 0,15
0,15 0,25
S6 S5
0,05 0,10
0,6 0,4
S1 S3 S2
0,3
0,3 0,15 0,25
S4 0,15
0,15
S6 S5
0,05 0,10
30
Algoritmi i structuri de date Lect. Univ. Dr. Gabriela Mihai
0,6 0,4
S1 S3 S2
0,3
0,3 0,15 0,25
S4 0,15
0,15
S6 S5
0,05 0,10
1
1
0 1
0,6 0,4
00 01 10 11
S1 S3 S2
0,3
0,3 0,15 0,25
010 011
S4 0,15
0,15
0110 0111
S6 S5
0,05 0,10
31