Sunteți pe pagina 1din 10

COLEGIUL NATIONAL ION NECULCE

ATESTAT LA INFORMATICA
SORTARE DE VECTORI

Elev: Ionita Ana-Maria


cls. a XII-a E

Prof. Coordonator :
Buse Elena

SESIUNEA 2012

CUPRINS:
1. Introducere

2. Tema lucrarii de atestat


3. Metode de sortare
4. Sortare prin interschimbare
5. Sortare prin interclasare
6. Sortare rapida

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.

TEMA LUCRARII DE ATESTAT


Asa cum am mentionat in paragraful anterior proiectul echipei de
programatori de la Bell Laboratories a avut in cele din urma un ecou imens iar
limbajul s-a impus ulterior si pe alte sisteme de operare decat cel pentru care a fost
elaborat. Avantajele utilizarii lui (un numar relativ mic de cuvinte
rezervate,portabilitatea, setul puternic de operatori, facilitatile oferite pentru lucrul
cu pointeri, posibilitatea definirii tipurilor de date specificate de programatori si
nivelul inalt de concizie ) l-au facut sa fie utilizat in prezent in scara larga . Astazi
limbajul cunoaste o foarte mare raspandire si exista numeroase variante de
compilatoare implementate pe toate platformele si sistemele de operare. Date fiind
avantajele sale comparativ cu alte limbaje de programare studiate in scoli (Pascal)
decizia de a imi efectua lucrarea de atestat in acest limbaj a fost aproape evidenta. O
alta calitate foarte importanta a sa este posibilitatea de a interfata cu multe alte
limbaje: modulele scrise in C sau in C++ pot fi importate in majoritatea limbajelor
actuale (Java, Pascal, Basic, Assembler, Oracle, Prolog, Informix, Paradox). Larga
aplicabilitate a notiunii de vector in domeniu m-a determinat in alegerea subiectului
lucrarii de atestat Intrucat in general algoritmii prelucreaza seturi de date care sunt
omogene (de acelasi tip si cu aceleasi caracteristici) vectorii sunt frecvent utilizati
Spre deosebire de acestia, listele au o dinamicitate mai mare si modificare numarului
de elemente se realizeaza cu un numar de operatii semnificativ mai mic. Insa
vectorii sunt preferati in situatiile in care numarul de elemente utilizate nu se
modifica pe parcursul executiei si avantajul lor este ca accesul la un anumit element
se realizeaza cu un numar mai mic de operatii decat in cazul listelor.

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.

SORTARE PRIN INERSCHIMBARE


Aceasta metoda se bazeaza pe comparatii intre elemente aflate pe pozitii
succesive, algoritmul nu este deloc complicat insa nu exceleaza in eficienta.Se
parcurge vectorul inversand continuturile componenteleor alaturate care nu sunt in
ordine crescatoare. Procedeul se repeta pana cand are loc o parcurgere in care nu se
fac inversari.
Exemplu: Fie situatia initiala
3

v[1]

v[2]

v[3]

v[4]

Se efectueaza prima parcurgere si se inverseaza valorile retinute de prima si


a doua componenta obtinandu-se:
1

v[1]

v[2] v[3]

2
v[4]

Valorile retinute de a doua si a treia componenta nu se inverseaza, in schimb


se inverseaza valorile retinute de a treia si a patra componenta:
1
3
2
4
v[1] v[2] v[3] v[4]
Intrucat au avut loc inversari se reparcurge vectorul si se inverseaza valorile
retinute de a doua si a treia componenta:
1
v[1]

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.

2. SORTARE PRIN INTERCLASARE


Acest algoritm de sortare urmeaza indeaproape paradigma divide et impera.
Divide et impera se bazeaza pe unrmatorul principiu: se descompune problema in
mai multe subprobleme care pot fi rezolvate, iar solutia pentru problema initiala se
obtine combinand solutiile problemelor in care a fost descompusa aceasta. Se
presupune ca fiecare din problemele in care a fost descompusa problema initiala, se
poate descompune in alte subprobleme, la fel cum a fost descompusa problema
initiala. Procedeul se reia pana cand (in urma descompunerilor repetate) se ajunge
la probleme care admit rezolvare imediata. La fiecare nivel avem doua posibilitati:
1) am ajuns la o problema care admite o rezolvare imediata, caz in care se
rezolva si se revine din apel (conditia de terminare)
2)

nu am ajuns in situatia de la punctul 1) , caz in care descompunem


problema in doua sau mai multe probleme, pentru fiecare din ele repetam
functia, combinam rezulattele si revenim din apel.

Algoritmul de sortare prin interclasre se bazeaza pe urmatoarea idee: pentru a


sorta un vector cu n elemente il impartim in doi vectori care, odata sortati, se
interclaseaza. Conform strategiei generale Divide et impera, problema este
descompusa in alte doua subprobleme de acelasi tipsi, dupa rezolvarea lor,
rezultatele se combina (se interclaseaza). Descompunerea unui vector in alti doi
vectori ce urmeaza a fi sortati are loc pana cand avem de sortat vectori de una sau
doua componente.
Metoda de sortare prin interclasare imparte sirul de n elemente initial in doua
subsiruri de cate n/2 elemente, sorteaza recursiv cele doua subsiruri utilizand
sortarea prin interclasare si interclaseaza cele doua subsiruri sortate pentru a
produce rezultatul final. Se observa ca recursivitatea se opreste cand sirul de sortat
are lungimea 1, deoarece orice sir de lungime 1 este deja sortat.
Exemplu: sa presupune, ca avem doua pachete de carti de joc asezate pe masa
cu fata in sus. Fiecare dintre cele doua pachete este sortat, cartea cu valoarea cea
mai mica fiind deasupra. Dorim sa amestecam cele doua pachete intr-un singur
pachet sortat, care sa ramana asezat pe masa cu fata in jos. Pasul principal este
acela de a selecta cartea cu valoarea cea mai mica dintre cele doua aflate deasupra
pachetelor(fapt care va face ca o noua carte sa fie deasupra pachtului respectiv) si
de a o pune cu fata in jos pe locul in care se va forma pachetul sortat final.
Repetam acest procedeu pana cand unul din pachete este epuizat.In aceasta faza,
este suficient sa luam pachetul ramas si sa il punem peste pachetul deja sortat
intorcand toate cartile cu fata in jos.

1
6

Am reprezentat in schema de mai sus modul de operare al sortarii prin


interclasare asupra vectorului v={5,2,4,6,1,3,2,6,}. Lungimile sirurilor sortate, in
curs de clasare, cresc pe masura ce algoritmul avanseaza de jos in sus.

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.

S-ar putea să vă placă și