PROIECT DE
ATESTAT INFORMATICA
1. Tema proiectului
1.1 Metode de sortare ale elementelor unui vector
Proiectul realizeaza implementarea unor tehnici cunoscute prin care se poate ordona un vector de numere intregi, crescator sau descrescator, in functie de optiunea utilizatorului. In practica, problemele de sortare apar sub forma ordonarii informatiilor memorate intr-o structura de tip baza de date, cele mai simple structuri de date fiind vectorii, listele si arborii. Informatiile trebuie sortate in functie de necesitatile utilizatorului si prezentate acestuia in forma coerenta ceruta, in vederea operatiilor ulterioare ce vor fi executate asupra lor. Un exemplu practic il poate reprezenta gestiunea unui magazin de articole vestimentare. Fiecare articol este retinut intr-o structura de date, prin numeroasele informatii despre acesta(denumire, pret, numar de articole de acelasi tip disponibile in stoc, etc.). In acest caz particular poate aparea necesitatea de a ordona articolele vestimentare dupa pret, sau dupa numarul de articole ramase in stoc, pentru un eventual inventar. Proiectul se va ocupa insa de ordonarile simple pe vector de elemente intregi, deci un singur camp de informatie de ordonat. Diversele tehnici prezentate sunt diferite prin complexitate si grad de eficienta, de aici si nevoia de a alege metoda cea mai potrivita pentru o situatie data.
Metodele de sortare sunt, bineinteles, variate, iar proiectul le trateaza doar pe cele mai folosite dintre acestea.
Aplicatia care pune la dispozitie tehnicile ce vor fi discutate in continuare, a fost scrisa in limbajul de programare Pascal, si foloseste un meniu pentru comunicarea cu utilizatorul. Fisierul executabil al aplicatiei se numeste Sortari.exe.
2. Consideratii teoretice
2.1 Descrierea metodelor de sortare utilizate de aplicatie
In continuare, vor fi descrise tehnicile de sortare implementate in limbajul Pascal, prezentand algoritmul lor de functionare. Fiecare metoda discuta ordonarea crescatoare a elementelor vectorului, devreme ce ordonarea descrescatoare nu difera ca pasi de parcurs. Aplicatia pune la dispozitie, totusi, ambele posibilitati de a ordona un vector, prin implementarea a doua proceduri(pentru ordonare crescatoare si descrescatoare) pentru fiecare metoda in parte.
2.1.1 Sortarea prin insertie directa.
Algoritmii de insertie presupun parcurgerea sirului(vectorului) si insertia fiecarui element in subsirul ordonat creat anterior din elementele precedente.
Fie i cu proprietatea a1<a2<<ai-1. Trebuie sa inseram pe ai in subsirul anterior. Pentru aceasta va trebui sa comparam pe rand pe ai cu ai-1, ai-2, pana cand vom gasi un element aj cu aj<=ai. Adica va trebui parcurs sirul a1<a2 <ai-1 de la dreapta catre stanga pana cand un element aj<=ai. Daca acest element nu exista oprirea se va face pe primul element al sirului adica pe a1. Vom insera pe ai dupa aj.
Procedura in limbajul Pascal care realizeaza operatiile descrise mai sus este:
procedure SortInsDir_C(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=2 to n do
begin
x:=A[i];
j:=i-1;
while (x<A[j]) and (j<>0) do
begin
A[j+1]:=A[j];
j:=j-1;
end;
A[j+1]:=x;
end;
end;
2.1.2 Sortarea prin insertie binara.
Algoritmul este similar cu cel anterior doar ca locul in care se face inserarea elementului ai se cauta printr-un algoritm de cautare binara.
Procedura SortInsBin_C exemplifica acest algoritm:
procedure SortInsBin_C(var A:vector; n:integer);
var x,i,j,s,d,m:integer;
begin
for i:=2 to n do
begin
x:=A[i];
s:=1;
d:=i-1;
while (s<=d) do
begin
m:=(s+d) div 2;
if x<A[m] then d:=m-1
else s:=m+1;
end;
for j:=i-1 downto s do
A[j+1]:=A[j];
A[s]:=x;
end;
end;
2.1.3. Sortarea prin numarare.
Acest algoritm numara pentru fiecare element ai cate elemente mai mici strict decat el exista. Numerele obtinute le vom memora intr-un vector notat C. Pe baza acestuia vom rearanja elementele vectorului A intr-un alt vector notat B. In final vectorul B va fi copiat in A, deoarece B contine elementele lui A ordonate crescator. Pentru aceasta metoda s-a presupus ca elementele vectorului A sunt distincte.
Procedura SortNum_C care implementeaza algoritmul:
procedure SortNum_C(var A:vector; n:integer; B,C:vector);
var i,j:integer;
begin
for i:=1 to n do
C[i]:=1;
for j:=2 to n do
for i:=1 to j-1 do
if A[i]<A[j] then C[j]:=C[j]+1
else C[i]:=C[i]+1;
for i:=1 to n do
B[C[i]]:=A[i];
for i:=1 to n do
A[i]:=B[i];
end;
2.1.4. Sortarea prin selectie.
Acest algoritm are la baza problema selectiei, aceasta presupunand ca, avand un vector A=(a1, a2, , an) se cere sa se determine al k-lea cel mai mic element cu 1≤k≤n.
Deci, la pasul 1 se determina ak=min si se interschimba a1 cu ak, la pasul 2 se determina ak=min si se interschimba a2 cu ak, la pasul 3 se determina ak=min si se interschimba a3 cu ak, …, la pasul i se determina ak=min si se interschimba ai cu ak, …, pana la pasul n-1 se determina ak=min si se interschimba an-1 cu ak.
Procedura pentru sortarea prin selectie este SortSel_C:
procedure SortSel_C(var A:vector; n:integer);
var x,i,j,k:integer;
begin
for i:=1 to n-1 do
begin
k:=i;
x:=A[i];
for j:=i+1 to n do
if A[j]<x then
begin
k:=j;
x:=A[k];
end;
A[k]:=A[i];
A[i]:=x;
end;
end;
2.1.5 Metoda bulelor(Bubble sort).
Algoritmul de interschimbare consta in modificari succesive de forma ai↔aj (interschimbarea lui ai cu aj) pana cand elementele vectorului apar in ordinea ceruta de utilizator(crescatoare, in exemplul nostru). Din categoria algoritmilor de interschimbare fac parte metoda bulelor(Bubble sort) care va fi descrisa in acest paragraf, si metoda interschimbarii directe(care va fi discutata in paragraful urmator).
Metoda bulelor se mai numeste si sortarea prin interschimbare cu „fanion”.
Vom introduce notatia ai<>aj care presupune ca se compara ai cu aj si (numai daca ai>aj ) se efectueaza interschimbarea ai↔aj.
Metoda are n-1 etape. In prima etapa se efectueaza operatiile: a1<>a2; a2<>a3; an-1<>an. In urma acestor operatii a1 se va deplasa spre dreapta(se va „ridica”) peste toate elementele mai mici decat el pana la primul ai mai mare decat el. In continuare acelasi lucru se va intampla si cu ai etc. In concluzie cel mai mare element va fi plasat pe ultima pozitie. Evident in etapa k se vor efectua operatiile: a1<>a2 ; a2<>a3; an-k <>an-k+1.
Procedura care implementeaza algoritmul este SortBubble_C:
procedure SortBubble_C(var A:vector; n:integer);
var x,i:integer;
ok:boolean;
begin
repeat
ok:=true;
for i:=1 to n-1 do
if A[i]>A[i+1] then
begin
x:=A[i];
A[i]:=A[i+1];
A[i+1]:=x;
ok:=false;
end;
until (ok=true);
end;
2.1.6.Sortare prin interschimbare directa.
Metoda interschimbarii directe este asemanatoare cu cea anterioara diferentele evidentiindu-se la modul de comparare. In prima etapa se efectueaza operatiile: a1<>a2; a1<>a3; a1<>an, etc., in etapa k se vor efectua operatiile ak<>ak+1; ak<>ak+2; ak<>an iar in ultima etapa se va efectua operatia an-1<>an.
Procedura SortIntersch_C realizeaza algoritmul descris:
procedure SortIntersch_C(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
if A[i]>A[j] then
begin
x:=A[i];
A[i]:=A[j];
A[j]:=x;
end;
end;
end;
3. Meniul aplicatiei
Aplicatia Sortari.exe foloseste un meniu pentru interactiunea cu utilizatorul, pentru introducerea elementelor vectorului de sortat, alegerea metodei de sortare si ordinea(crescatoare, descrescatoare) in care vor fi sortate elementele.
1. Primul ecran se prezinta astfel:
2. Dupa introducerea numarului de elemente ale vectorului notat A, se trece la introducerea fiecarui element in parte:
3. Meniul principal ofera apoi, utilizatorului, optiuni in privinta metodei de sortare a vectorului:
4. In continuare, dupa alegerea metodei, utilizatorul este rugat sa specifice modul de ordonare a elementelor vectorului:
5. In final vectorul este afisat ordonat, in functie de optiune:
4. Listarea programului in Pascal
program sortari;
uses crt;
const max=100;
type vector=array[1..max] of integer;
var A,B,C:vector;
n:integer;
opt,ord:integer;
procedure CitesteVector(var A:vector; var n:integer);
var i:integer;
begin
gotoxy(25,10);
write('Numarul de elemente ale vectorului: ');readln(n);
for i:=1 to n do
begin
gotoxy(25,11+i);
write('A[',i,']=');
readln(A[i]);
end;
end;
procedure SortInsDir_C(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=2 to n do
begin
x:=A[i];
j:=i-1;
while (x<A[j]) and (j<>0) do
begin
A[j+1]:=A[j];
j:=j-1;
end;
A[j+1]:=x;
end;
end;
procedure SortInsDir_D(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=2 to n do
begin
x:=A[i];
j:=i-1;
while (x>A[j]) and (j<>0) do
begin
A[j+1]:=A[j];
j:=j-1;
end;
A[j+1]:=x;
end;
end;
procedure SortInsBin_C(var A:vector; n:integer);
var x,i,j,s,d,m:integer;
begin
for i:=2 to n do
begin
x:=A[i];
s:=1;
d:=i-1;
while (s<=d) do
begin
m:=(s+d) div 2;
if x<A[m] then d:=m-1
else s:=m+1;
end;
for j:=i-1 downto s do
A[j+1]:=A[j];
A[s]:=x;
end;
end;
procedure SortInsBin_D(var A:vector; n:integer);
var x,i,j,s,d,m:integer;
begin
for i:=2 to n do
begin
x:=A[i];
s:=1;
d:=i-1;
while (s<=d) do
begin
m:=(s+d) div 2;
if x>A[m] then d:=m-1
else s:=m+1;
end;
for j:=i-1 downto s do
A[j+1]:=A[j];
A[s]:=x;
end;
end;
procedure SortNum_C(var A:vector; n:integer; B,C:vector);
var i,j:integer;
begin
for i:=1 to n do
C[i]:=1;
for j:=2 to n do
for i:=1 to j-1 do
if A[i]<A[j] then C[j]:=C[j]+1
else C[i]:=C[i]+1;
for i:=1 to n do
B[C[i]]:=A[i];
for i:=1 to n do
A[i]:=B[i];
end;
procedure SortNum_D(var A:vector; n:integer; B,C:vector);
var i,j:integer;
begin
for i:=1 to n do
C[i]:=1;
for j:=2 to n do
for i:=1 to j-1 do
if A[i]>A[j] then C[j]:=C[j]+1
else C[i]:=C[i]+1;
for i:=1 to n do
B[C[i]]:=A[i];
for i:=1 to n do
A[i]:=B[i];
end;
procedure SortSel_C(var A:vector; n:integer);
var x,i,j,k:integer;
begin
for i:=1 to n-1 do
begin
k:=i;
x:=A[i];
for j:=i+1 to n do
if A[j]<x then
begin
k:=j;
x:=A[k];
end;
A[k]:=A[i];
A[i]:=x;
end;
end;
procedure SortSel_D(var A:vector; n:integer);
var x,i,j,k:integer;
begin
for i:=1 to n-1 do
begin
k:=i;
x:=A[i];
for j:=i+1 to n do
if A[j]>x then
begin
k:=j;
x:=A[k];
end;
A[k]:=A[i];
A[i]:=x;
end;
end;
procedure SortBubble_C(var A:vector; n:integer);
var x,i:integer;
ok:boolean;
begin
repeat
ok:=true;
for i:=1 to n-1 do
if A[i]>A[i+1] then
begin
x:=A[i];
A[i]:=A[i+1];
A[i+1]:=x;
ok:=false;
end;
until (ok=true);
end;
procedure SortBubble_D(var A:vector; n:integer);
var x,i:integer;
ok:boolean;
begin
repeat
ok:=true;
for i:=1 to n-1 do
if A[i]<A[i+1] then
begin
x:=A[i];
A[i]:=A[i+1];
A[i+1]:=x;
ok:=false;
end;
until (ok=true);
end;
procedure SortIntersch_C(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
if A[i]>A[j] then
begin
x:=A[i];
A[i]:=A[j];
A[j]:=x;
end;
end;
end;
procedure SortIntersch_D(var A:vector; n:integer);
var x,i,j:integer;
begin
for i:=1 to n-1 do
begin
for j:=i+1 to n do
if A[i]<A[j] then
begin
x:=A[i];
A[i]:=A[j];
A[j]:=x;
end;
end;
end;
procedure AfiseazaVector(A:vector; n:integer);
var i:integer;
begin
gotoxy(22,15);
write('Vectorul sortat este: ');
for i:=1 to n do
write(A[i],' ');
end;
begin
clrscr;
CitesteVector(A,n);
repeat
clrscr;
gotoxy(25,10);
writeln('1.Sortare prin inserare directa');
gotoxy(25,11);
writeln('2.Sortare prin inserare binara');
gotoxy(25,12);
writeln('3.Sortare prin numarare');
gotoxy(25,13);
writeln('4.Sortare prin selectie');
gotoxy(25,14);
writeln('5.Sortare prin metoda bulelor');
gotoxy(25,15);
writeln('6.Sortare prin interschimbare');
gotoxy(25,16);
writeln('7.Iesire');
gotoxy(25,17);
writeln;
gotoxy(25,18);
write('Optiunea:');readln(opt);
case opt of
1: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortInsDir_C(A,n)
else
if ord=2 then SortInsDir_D(A,n)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
2: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortInsBin_C(A,n)
else
if ord=2 then SortInsBin_D(A,n)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
3: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortNum_C(A,n,B,C)
else
if ord=2 then SortNum_D(A,n,B,C)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
4: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortSel_C(A,n)
else
if ord=2 then SortSel_D(A,n)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
5: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortBubble_C(A,n)
else
if ord=2 then SortBubble_D(A,n)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
6: begin
clrscr;
gotoxy(25,10);
writeln('1.Crescator');
gotoxy(25,11);
writeln('2.Descrescator');
gotoxy(25,12);
writeln;
gotoxy(25,13);
write('Optiunea:');readln(ord);
if ord=1 then SortIntersch_C(A,n)
else
if ord=2 then SortIntersch_D(A,n)
else begin
gotoxy(22,15);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
AfiseazaVector(A,n);
readln;
end;
7: exit;
else begin
gotoxy(25,21);
writeln('Nu ati introdus corect numarul optiunii');
readln;
exit;
end;
end;
until (opt=7);
write('Vectorul sortat crescator este: ');
AfiseazaVector(A,n);
readln;
end.
|