Documente Academic
Documente Profesional
Documente Cultură
ATESTAT LA INFORMATICA
SORTARE DE VECTORI
Prof. Coordonator :
Buse Elena
SESIUNEA 2012
CUPRINS:
1. Introducere
Bibliografie :
Informatica Varianta C++ , manual pentru clasa aIX-a - Tudor Sorin
editura L&S Infomat
Informatica Varianta C++, manual pentru clasa a X-a - Tudor Sorin
editura L&S Infomat;
Manual de C/C++- Dorian Stoilescu; editura Radial
Limbajele C si C++ pentru incepatori- Liviu Negrescu
INTRODUCERE
Limbajul C a fost elaborat in anii `70 de catre Brian W. Kernighan si Dennis
M. Ritchie de la Bell Laboratories, New Jersey, pe baza unor dezvoltari ale
limbajelor B si BCPL. Initial a fost destinat scrierii unei parti a sistemului de operare
UNIX . Era necesar un nou limbaj pentru scrierea unui sistem de operare care sa fie
cat mai independent posibil de platforma hardware aleasa. Dezvoltarea limbajului C
a fost asociata la inceput cu dezvoltarea sistemului de operare UNIX. Chiar daca
eforturile de implementare nu au fost la inceput incununate de succes, proiectul a
avut in cele din urma un ecou imens.
Caracteristicile distinctive ale limbajului au fost clar definite de la inceput,
ele fiind pastrate si in dezvoltarile ulterioare. Acestea au fost:
portabilitate maxima
structurarea
posibilitatea efectuarii si optimizarii operatiilor la nivelul masinii:
lucrul cu o mare diversitate de periferice
interfata eficienta cu sistemul de operare
optimizarea operatiilor de prelucrare a datelor
Aceasta face ca limbajul C sa fie considerat un limbaj de nivel mediu, insa
nu inseamna ca el este mai slab decat limbajele de nivel inalt sau ca ridica
probleme de portabilitate specifice limbajelor de asamblare ci ca incearca sa
combine avantajele celor doua tipuri de limbaje. Portabilitatea sistemului de
operare Unix a reusit, iar limbajul s-a impus ulterior si pe alte sisteme de operare
decat UNIX. In 1983 a inceput elaborarea standardizarii limbajului C (varianta
ANSI C) si definitivata in 1990. La sfarsitul anilor `80 , pe baza limbajului C, a
fost creat de catre Bjarne Stroustrup limbajul C++ care ofera un plus de rigurozitate
si permite folosirea tehnicilor de programare orientata pe obiecte. Limbajul C face
parte din familia limbajelor de programare structurata. Datele pot fi organizate in
colectii de elmente de diferite tipuri. Programatorul are posibilitatea de a
definipropriile tipuri, ceea ce faciliteaza o reprezentare adecvata a informatiilor ce
vor fi prelucrate. Spre deosebire de Pascal, structura programelor este mai simpla si
mai uniforma pentru ca in C subrutinele sunt organizate doar sub forma functiilor
si pentru ca functiile nu pot fi definite una in interiorul alteia. Un program este
format din mai multe functii care efectueaza activitati clar definite si care sunt bine
delimitate de restul programului. Unitatea de baza ain limbajul C este functia iar
aceasta poate fi compusa din mai multe blocuri. Un bloc este o secventa de mai
multe declaratii, definitii si instructiuni care fixeaza durata de valabilitate a
variabilelor si a constantelor simblolice definite in interiorul sau. Blocul poseda
aceeasi calitate ca si functiile de a proteja variabilele locale.
METODE DE SORTARE
Sa consideram urmatoarea situatie: se citesc n numere intregi si se cere ca
acestea sa fie scrise in ordine crescatoare. Exemplu: se citesc 4 numere (n=4)
3,1,6,2 si vor fi afisate in ordine crescatoare 1,2,3,6. Operatia prin care se
aranjeaza cele n numere in ordine crescatoare se numeste sortare. Pentru a sorta
cele n valori, acestea se citesc intr-o variabila de tip tablou in cadrul careia se
efectueaza sortarea propriu-zisa. In timp au fost elaborati foarte multi algoritmi de
sortare dar acest atestat isi propune sa studieze cativa dintre dintre ei: sortarea prin
interschimbare, sortarea prin interclasare si sortarea rapida.
v[1]
v[2]
v[3]
v[4]
v[1]
v[2] v[3]
2
v[4]
2
3
v[2] v[3]
4
v[4]
Nu mai sunt necesare alte inversari dar intrucat in actuala parcurgere au fost
facute inversari, se reparcurge vectorul; de data aceasta nu mai sunt necesare
inversari asa ca algoritmul se incheie.
1
6
3. SORTARE RAPIDA
Algoritmulde sortare rapida, ca de altfel si algoritmul de sortare prin
interclasare, se bazeaza pe paradigma Divide et impera .
Exemplu : Sa consideram sirul A[p..r]. Acesta este impartit (rearanjat) in doua
subsiruri nevide A[p..q] si a[q+1..r] astfel incat fiecare element al subsirului
A[p..q] sa fie mai mic sau egal cu orice element al subsirului a[q+1..r]. Indicele q
este calculat de procedura de partitionare. Cele doua subsiruri A[p..q] si A[q+1..r]
sunt sortate prin apeluri recursive ale algoritmului de sortare rapida. Deoarece cele
doua subsiruri sunt sortate pe loc, nu este nevoie de nici o combinare, sirul A[p..r]
este ordonat.
Descrierea algoritmului este urmatoarea:
QUICKSORT(A,p,r)
daca p<r atunci
q PARTITIE(A,p,r)
QUICKSORT(A,p,q)
QUICKSORT(A,q+1,r)
Pentru ordonarea intregului sir A, initial se apeleaza QUICKSORT (A, 1,
lungime[A] ).
Cheia algoritmului este procedura PARTITIE, care rearanjeaza pe loc subsirul
A[p..r].
PARTITIE (A,p,r)
xA[p]
ip-1
jr+1
cat timp ADEVARAT executa
repeta
jj-1
pana cand A[j]<=x
repeta
ii+1
pana cand A[i]>=x
daca i<j atunci
interschimba A[i] A[j]
altfel
returneaza j
Intai se selecteaza un element x=A[p] din sirul A[p..r] care va fi elementul
pivot in jurul caruia se face partitionarea sirului A[p..r]. Apoi cele doua subsiruri
A[p..i] si A[j..r] cresc la inceputul si respectiv la sfarsitul sirului A[p..r] astfel incat
fiecare element al sirului A[p..i] sa fie mai mic sau egal cu x, si orice element al
sirului A[j..r], mai mare sau egal cu x. La inceput i=p-1 si j=r+1, deci cele doua
subsiruri sunt vide.
In interiorul ciclului cat timp indicele j se decrementeaza, iar i se
incrementeaza pana cand A[i]>=x>=A[j]. Presupunand ca inegalitatile de mai sus
sunt stricte , A[i] este prea mare ca sa apartina primului subsir(cel de la inceput) ,
iar A[j] prea mic ca sa apartina celui de al doilea subsir (cel de la sfarsit). Astfel,
interschimband A[i] cu A[j], cele doua parti cresc. (Interschimbarea se poate face si
in cazul in care avem inegalitati stricte.
Ciclul cat timp se repeta pana cand inegalitatea i>=j devine adevarata. In
acest moment, intregul sir A[p..r] este partitionat in doua subsiruir A[p..q] si
A[q+1..r], astfel incat p<=q<r si nici u element din A[p..q] nu este mai mare decat
orice element din A[q+1..r]. procedura returneaza valoarea q=j.
De fapt procedura de partitionare executa o operatie simpla: pune
elementele mai mici decat x in primul subsir , iar pe cele mai mari decat x in
subsirul al doilea. Exista cateva particularitati care determina o comportare
interesanta a procedurii PARTITIE. De exemplu, indicii i si j nu depasesc niciodata
marginile vectorului A[p..r], dar acest lucru nu se vede imediat din textul
procedurii.Un alt exemplu: este important ca elementul A[p] sa fie utilizat drept
element pivot x. In schimb, daca se foloseste A[r] ca element pivot, si, intamplator,
A[r] este cel mai mare element al vectorului A[p..r], atunci PARTITIE returneaza
procedurii QUICKSORT valoarea q=r, si procedura intra intr-un ciclu infinit.