Sunteți pe pagina 1din 6

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/345890118

Modelarea și simularea algoritmului QuickSort în limbajele C++, C, Java,


Python, C# pe platforme computaționale Cloud

Article · November 2020

CITATIONS READS

0 168

1 author:

Bogdan-Alexandru Soare
Polytechnic University of Bucharest
5 PUBLICATIONS   0 CITATIONS   

SEE PROFILE

All content following this page was uploaded by Bogdan-Alexandru Soare on 15 November 2020.

The user has requested enhancement of the downloaded file.


Modelarea și simularea algoritmului
QuickSort în limbajele C++, C, Java, Python,
C# pe platforme computaționale Cloud
Bogdan-Alexandru SOARE
Facultatea de Electronică, Telecomunicații și Tehnologia Informației
Universitatea Politehnica din București, România
soare990@gmail.com

Abstract: Această lucrare are ca scop prezentarea În Fig.1 putem observa clasamentul realizat de către IEEE
eficienței și comparația algoritmului de sortare QuickSort în pentru anul 2019 în ceea ce priveste nivelul de utilizare al
ceea ce privește timpul de execuție și memoria de program limbajelor de programare existente. În cadrul acestuia regăsim
ocupată pentru următoarele limbaje de programare: C++, limbaje din toate domeniile de activitate, precum: Web,
C, Java, Python și C#. Vor fi evidențiate avantajele și Enterprise, Mobile și Embedded. Primele cinci locuri din
dezavantajele implementării acestui algoritm în cadrul clasament sunt ocupate la un scor foarte strâns de următoarele
fiecărui limbaj enumerat anterior integrând în lucrarea limbaje: Python, Java, C și C++, patru dintre acestea urmând a
curentă reprezentarea grafică a timpilor de execuție fi discutate în capitolele ce urmează.
raportați la memoria utilizată.
Key Words: Limbaj de programare, timp de execuție,
memorie de program, cloud computing, IDE(Integrated
Development Environment).

I. INTRODUCERE II. A L G O R I T M UL Q U I C K S O RT

Un limbaj de programare reprezintă un limbaj de expresii și QuickSort este un algoritm de sortare eficient, ce oferă o
tehnici valide de formulare a instrucțiunilor pentru o platformă metodă sistematică de aranjare în ordine a elementelor unui
computațională. Orice limbaj de programare are definite un set fișier sau a unui vector. Acesta, în cazul unei implementări
de reguli sintactice și semantice ce dau posibilitatea eficiente poate fi de două sau chiar trei ori mai rapid decât
utilizatorului să specifice în mod exact și amănunțit acțiunile pe ceilalți competitori ai săi precum: MergeSort, HeapSort [1].
care trebuie sa le execute calculatorul. Fiecare limbaj de Algoritmul este unul ce funcționează pe principiul sortării
programare are o sintaxă și un set unic de cuvinte cheie pentru prin comparație, asta însemnând că poate sorta orice tip de
organizarea instrucțiunilor de program. elemente ce au o ordine bine definită. Implementările eficiente
Limbajele se pot clasifica în Low-Level reprezentând o ale acestui algoritm nu sunt stabile din punctul de vedere al
perspectivă mai apropiată de modul de abordare al calculatorului pașilor de desfășurare, acestia fiind puternic influențați de
în ceea ce privește instrucțiunile și High-Level reprezentând alegerea pivotului.
modul de abordare apropiat de utilizator. Pe scurt, QuickSort se bazează pe principiul Divide et
impera. Acesta împarte în două un vector de elemente urmând
ca mai apoi să sorteze recursiv pe fiecare dintre aceștia.

Fig. 1 Clasament IEEE - 2019 Top Limbaje de Programare [11] Fig. 2 Exemplu de aplicare a algoritmului QuickSort [12]
Principalii pași ai sortării de tip QuickSort:

1) Alegerea unui element din vector ce va fi numit ’pivot’.


valoare drept pivot. În cazul în care considerăm următoarea
2) Partiționarea sau rearanjarea vectorului, astfel încât toate strategie de partiție:
elementele mai mici decat pivotul să fie plasate înaintea
acestuia, în timp ce toate elementele cu valori mai mari să fie 𝑇(𝑛) = 𝑇(0) + 𝑇(𝑛 − 1) + 𝛳(𝑛)
plasate după(elementele cu valori egale cu a pivotului pot fi
plasate în oricare din direcții). După acești pași, pivotul se va 𝑒𝑐ℎ𝑖𝑣𝑎𝑙𝑒𝑛𝑡 𝑐𝑢: 𝑇(𝑛) = 𝑇(𝑛 − 1) + 𝛳(𝑛)
afla în poziția sa finală. Acest pas are denumirea de operație de
partiție. ,unde ultimul element este întotdeauna ales drept pivot. Worst-
Case ar apărea dacă vectorul ar fi deja sortat în ordine
3) Pașii prezentați anterior vor fi aplicați recursiv pe fiecare din crescătoare sau descrescătoare.
subvectorii evidențiați ca având valori mai mici, respectiv ca
având valori mai mari decât pivotul ales.

Cazurile de bază ale acestei recursivități sunt reprezentate Best-Case – complexitate 𝑶(𝒏𝑳𝒐𝒈𝒏)
de vectorii de dimensiuni 0 sau 1, care sunt considerate a fi în Acest caz apare în momentul în care procesul de partiție alege
ordine prin definiție. Acestea sunt cazurile în care sortarea nu se drept pivot elemental din mijlocul vectorului. Acesta poate fi
mai aplicpă. reprezentat de următoarea ecuație:
Alegerea pivotului sau a pașilor de partiționare pot fi realizate
prin diferite metode: 𝑇(𝑛) = 2𝑇(𝑛/2) + 𝛳(𝑛)

- Alegerea pivotului ca fiind primului element din vector


sau subvector;
- Alegerea pivotului ca fiind ultimul element din vector Average-Case – complexitate 𝑶(𝒏𝑳𝒐𝒈𝒏)
sau subvector; Pentru a putea analiza acest caz, trebuie să considerăm toate
- Alegerea unui element aleator din vectorul dat ca fiind posibilele permutări ale vectorului și să calculăm timpul necesar
pivot; pentru realizarea fiecăreia dintre acestea.
- Alegerea pivotului ca fiind elementul median din Putem considera cazul particular în care după procesul de
cadrul vectorului; partiție, am pune 𝑂(𝑛/9) elemente într-unul din cei doi
subvectori și 𝑂(9𝑛/10) în celălalt subvector. Putem urmări
recurența cazului current în următoarea ecuație:
Timpul de execuție al QuickSort în general poate fi descries
de următoarea ecuație: 𝑇(𝑛) = 𝑇(𝑛/9) + 𝑇(9𝑛/10) + 𝛳(𝑛)

𝑇(𝑛) = 𝑇(𝑘) + 𝑇(𝑛 − 𝑘 − 1) + 𝛳(𝑛)

Primii doi termeni sunt reprezentați de două apelări recursive, în Deși complexitatea din Worst-Case este este mult mai mare
timp ce ultimul termen este indicator al procesului de partiție. decât a multor alti algoritmi de sortare precum MergeSort și
k – numărul de elemente cu valori mai mici decât cea a pivotului; HeapSort, QuickSort este mult mai rapid în practică datorită
buclei interioare ce poate fi implementată eficient în cele mai
În tabelul I putem urmări complexitățile algoritmilor multe arhitecturi. QuickSort poate fi implementat în moduri
cei mai frecvent folosiți pentru sortarea de elemente. Este diferite prin schimbarea modalității de alegere a pivotului, motiv
evident faptul că timpul de execuție al algoritmului este puternic pentru care Worst-Case va fi un caz cu o frecvență de apariție
dependent de lungimea vectorului, și în cazul nostru, de strategia destul de scăzută.
aleasă pentru partiția pivotului. În continuare putem urmări cele Singurul algoritm de sortare, dintre cele prezentate în
trei cazuri posibile de complexitate în cadrul algoritmului tabelul I, considerat mai bun este MergeSort, în cazul unui
QuickSort [2]. volum foarte mare de date stocat în memoria externă.

Tabel 1 Comparație între complexitățile algoritmilor de sortare

Algorithm Worst Average Best


BubbleSort 𝑂(𝑛^2) 𝑂(𝑛^2) 𝑂(𝑛)
InsertionSort 𝑂(𝑛^2) 𝑂(𝑛^2) 𝑂(𝑛)
MergeSort 𝑂(𝑛𝑙𝑜𝑔𝑛) 𝑂(𝑛𝑙𝑜𝑔𝑛) 𝑂(𝑛𝑙𝑜𝑔𝑛)
HeapSort 𝑂(𝑛𝑙𝑜𝑔𝑛) 𝑂(𝑛𝑙𝑜𝑔𝑛) 𝑂(𝑛𝑙𝑜𝑔𝑛)
QuickSort 𝑂(𝑛^2) 𝑂(𝑛𝑙𝑜𝑔𝑛) 𝑂(𝑛𝑙𝑜𝑔𝑛)

Worst-Case – complexitate 𝑶(𝒏𝟐 )


Acest caz apare în momentul în care procesul de partiție alege
de fiecare dată elementul cu cea mai mică sau cea mai mare
III. A L E G E R E A P L AT F O R M E I Python
COMPUTAȚIONALE Python este un limbaj de programare high-level, interpretat, de
uz general, folosit în mare parte pentru programarea aplicațiilor
Web. Sintaxa permite dezvoltatorilor să exprime anumite idei
Cloud Computing descrie tehnologia ce permite accesul la într-o manieră mai clară spre deosebire de alte limbaje precum
diferite tipuri de resurse online de sisteme informatice, în special C. În ceea ce privește paradigma de programare, Python poate fi
resurse precum cele de stocare a datelo dar și de putere de calcul utilizat ca limbaj pentru programarea obiect-orientată, dar și ca
fără necesitatea gestionării directe din partea utilizatorului. unealtă pentru programarea imperativă, funcțională sau
Acest termen în mod general descrie data centere disponibile procedurală. Implementarea sa de referință este scrisă în C. [5]
unui grup mare de utilizatori prin intermediul internetului.
Grupurile mari de cloud de obicei au funcționalități distribuite
în locații multiple de servere. Locația acestor sisteme de calcul Java
este gestionată în funcție de conexiunea apropiată față de Java este un limbaj de programare orientat pe obiect, ce are acces
utilizator [3]. datorită noilor tehnologii la utilizarea sa în cadrul dispozitivelor
Principalele beneficii ale utilizării acestei tehnologii o mobile, agendelor electronice dar și în cadrul aplicațiilor
reprezintă adaptabilitatea vitezei de calcul în funcție de destinate intranet-urilor. Limbajul împrumută o mare parte din
necesitatea aplicației curente și valabilitatea unor resurse sintaxa sa din C, dar oferă un model al obiectelor mai simplu,
performante, cu capacități foarte mari de stocare la prețuri prezentând mai puține facilități în ceea ce privește programarea
reduse. low-level. [7]
Tehnologia de bază pe care cloud computing se bazează este
virtualizare. Virtualizarea software, separă computerul fizic în
unul sau mai multe dispozitive virtuale, fiecare dintre acestea C
permițând rularea taskurilor independente. Limbajul de programare C este un limbaj standardizat,
implementat pe majoritatea platformelor de calcul, și foarte
Caracteristici ale Cloud Computing [4]: utilizat în crearea sistemelor software. Acesta este un limbaj ce
stă la baza multor alte limbaje create anterior precum: C++, Java,
- Independență față de dispozitivele fizice dar și față de JavaScript, C#. Este un limbaj de programare minimalist, foarte
locația acestora; apropiat de limbajul de asamblare ducând astfel la o utilizare
- Întreținerea disponibilității aplicațiilor, întru-cât foarte apropiată de hardware. C-ul se focalizează în mare măsură
acestea pot fi accesate din diferite locații fără a mai pe paradigma programării procedurale utilizând un set simplu de
necesita instalarea în prealabil a acestora pe sistemul tipuri de date și oferind acces la nivel scăzut către memoria
local; calculatorului utilizând pointeri. Pointerii la funcții permit forme
- Distribuirea resurselor și a costurilor într-un grup mare rudimentare de polimorfism. [6]
de utilizatori
- Performanță ridicată și în același timp monitorizată;
- Securitate ridicată prin centralizarea datelor; C++
Acesta este un limbaj de programare general, compilat, realizat
ca o extensie la clasicul C ce permite programarea procedurală,
abstractizarea datelor dar și programarea orientată pe obiecte.
Implementarea algoritmului QuickSort, în ceea ce privește Datorită faptului că este rulat nativ de către sistemul de operare
modalitatea de compilare, editare și debug, a fost realizată pe o și a faptului că se pot face operații aritmetice cu pointeri, acest
platformă IDE(integrated development environment) online. limbaj, lucrează direct cu adresele de memorie ale variabilelor,
S-a utilizat o astfel de platformă datorită faptului că ea permite motiv pentru care este unul dintre cele mai rapide limbaje de
compilarea, respective interpretarea codului în toate limbajele de programare la prelucrarea vectorială a datelor [8].
programare propuse pentru realizarea studiului de caz. În cadrul
acestei platforme vom reuși să obținem date despre timpul de
execuție și memoria ocupată ce ulterior vor putea fi comparate, C#
fără a fi influențate în vreun fel de capaciatea compilatoarelor/ C Sharp este un limbaj de uz general, ce înglobează
interpretatoarelor independente instalate pe sistemul de functionalități precum: programarea funcțională, programarea
procesare local. orientate pe obiecte și programarea imperativă. Acesta
O platformă IDE este o aplicație software ce oferă facilități intenționează să aibă o sintaxă simplă, modernă ce își propune
complementare programatorilor în dezvoltarea software. Ea să ofere suport inginerilor software cu particularități precum:
constă în următoarele elemente de bază: editor de cod, debugger detecție a variabilelor neutilizate, garbage collector, detecție ale
și instrument de build automat. Exista anumite IDE-uri care limitelor de memorie. Este un limbaj portabil, foarte important
contin atat interpretoare cat si compilatoare în structura lor pentru utilizatorii cu experiență anterioară în C sau C++. Alte
(Eclipse, NetBeans). aspecte importante sunt economia de memorie și de putere de
În următoarele rânduri vom regăsi o descriere pe scurt a procesare necesare la rularea aplicațiilor dezvoltate în acest
capaticăților, împreună cu avantajele și dezavantajele fiecărui limbaj. [9]
limbaj de programare în parte.
IV. M O D E L A RE & S I M UL A R E Tabel 3 prezintă eficiența fiecărui limbaj de programare
în funcție de memoria ocupată de către acesta la compilare și
interpretare. Aici se poate observa diferența de memorie
În ceea ce privește modelarea și simularea caracteristicilor necesară dintre limbajele compilate precum C, C++, Java și cele
acestui algoritm, am realizat tabele experimental de dependență interpretate Python, JavaScript.
atât a timpilor de execuție cât și a memoriei ocupate în funcție
de limbajul de programare ales. În ambele cazuri au fost realizate Tabel 3 Memoria ocupată în funcție de limbaj
5 măsurători pentru sortarea unui vector cu dimensiuni cuprinse
între 10 și 105 elemente, unde fiecare element a fost generat cu
ajutorul unui algoritm de generare de numere aleatoare cu valori
cuprinse în intervalul 0 și 100.
În realizarea măsurătorilor, pentru fiecare limbaj de
programare au fost folosite aceleași seturi de valori generate
aleator pentru a ridica gradul de precizie la colectarea timpilor
individuali de execuție.
În Tabel 2, putem observa timpi în ms ce au fost necesari
fiecărui limbaj pentru a putea finaliza sortarea vectorilor de
elemente. Timpul cel mai mic de execuție, după cum se observă
a fost colectat de la limbajul C++, la o diferență destul de mică
de C, în capătul celălalt regăsind Python, care din cauza
modelului de interpretare a codului, generează timpi de execuție
chiar și de 10-20 de ori mai mari în comparație cu celelalte
limbaje de programare.

Tabel 2 Timpii de execuție ai QuickSort în funcție de limbaj

Fig. 3 Comparație grafică a volumului


În Fig. 3 putem observa media timpilor de execuție a mediu de date stocat în funcție de limbaj
algoritmului QuickSort, pentru cele 5 eșantioane de elemente
aleatoare, realizată independent de către fiecare limbaj.
În cazul nostru, în ceea ce privește utilizarea algoritmului de
sortare QuickSort, dupa analizarea datelor colectate putem
evidenția care sunt limbajele ce prezintă un avantaj. Se observă
că timpul de execuție cel mai mic a fost realizat de către limbajul
C++, ceea ce subliniază faptul că acesta ar fi cel mai potrivit în
cazul necesității unui timp de execuție foarte mare.
În schimb, daca memoria ocupată devine un impediment, din
valorile specificate anterior observăm că limbajul C a ocupat de
2 ori mai puțină memorie decât C++ iar timpii de execuție au
fost relativ apropiați. De aici deducem faptul că în cazul în care
cosiderăm performanța a fi îmbinarea dintre timpul rapid de
execuție și necesitatea de stocare cât mai mica, atunci limbajul
potrivit pentru toate acestea este C.

Fig. 4 Comparație grafică a mediei timpilor de execuție


pentru fiecare limbaj de programare
C O N C L U Z II [7] J. Gosling, B. Joy, G. Steele, G. Bracha and A. Buckley,
The Java Language Specification - Java SE 8 Edition,
Redwood City, California: Oracle America, 2015.
În concluzie, această lucrare și-a propus prezentarea celor mai [8] B. Stroustrup, The C programming language -
importante limbaje de programare utilizate în ziua de astăzi, cu C++(Computer program language), Reading, Mass:
descrierea sumară a caracteristicilor și a câteva diferențe și Addison-Wesley, 1997.
asemănări între acestea. Au fost prezentate modulul de lucru a
unuia dintre cei mai rapizi și eficienți algoritmi de sortare și [9] N. Hamilton, "The A-Z of Programming Languages:
detalii despre eficiența acestuia în cadrul implementării lui cu C#," ComputerWorld, 10 2008. [Online]. Available:
fiecare limbaj de programare. https://www.computerworld.com/article/3468847/the-a-
După analiza datelor colectate, a fost subliniat faptul că acest z-of-programming-languages-c.html. [Accessed 01
algoritm poate prezenta un randament ridicat din punct de vedere 2020].
al timpului de execuție dar și din cel al memoriei ocupate, doar [10] C. Kromenaker, "Saving Memory with C# Structs," 06
în situația în care, pentru rulare vom folosi un limbaj de 2019. [Online]. Available:
programare compilat iar codul va fi suficient de bine optimizat. http://clarkkromenaker.com/post/csharp-structs/.
Ca și rezultat final în comparația dintre cele 5 limbaje de [Accessed 01 2020].
programare discutate, în ceea ce privește implementarea [11] S. Cass, The Top Programming Languages 2019, 09:
algoritmului QuickSort, au fost prezentate două dintre cele mai IEEE Spectrum, 2019.
eficiente soluții. În funcție de rezultatul dorit dar si de resursele [12] P. Jain and U. Chaudhary, "QuickSort," GeeksforGeeks,
necesare, am obținut următoarele: N/A. [Online]. Available:
• C++: este limbajul ce a avut cel mai bun scor în ceea ce https://www.geeksforgeeks.org/quick-sort/. [Accessed
privește timpii de execuție ai sortării pentru cele 5 12 2019].
eșantioane de valori aleatoare. Acesta s-a poziționat
foarte aproape de limbajul C la o diferență de 1.1ms.
• C: este limbajul care, pe lângă timpul mediu foarte bun
realizat în urma procesului de sortare, a reușit să ocupe
cea mai buna poziție în clasamentul memoriei ocupate,
la o valoare de aproape două ori mai mică decât cea a
limbajului C++.
Cu toate acestea spuse, putem considera că ambele limbaje au
avut rezultate foarte bune, dar în ceea ce privește raportul timp
de execuție/ memorie ocupată am putut regăsi cea mai bună
valoare în cadrul limbajului C.

R E F E R I NȚ E

[1] Universitatea din Bucuresti, "Metode de sortare -


pregatire admitere -," 2019. [Online]. Available:
http://fmi.unibuc.ro/ro/pdf/2019/admitere/licenta/FMI_S
ortare_2019.pdf. [Accessed 12 2019].
[2] F. Moller, "Designing Algorithms," in Analysis of
QuickSort, Swansea University, 2017.
[3] M. Hamdaqa and L. Tahvildari, Cloud Computing
Uncovered: A Research Landscape, Ontario, Canada:
Software Technologies Applied Research
Group(STAR), 2012.
[4] A. Schurr, "Keep an eye on cloud computing," Network
World, 07 2018. [Online]. Available:
https://www.networkworld.com/article/2281563/keep-
an-eye-on-cloud-computing.html. [Accessed 01 2020].
[5] D. Kuhlman, A Python Book: Beginning Python,
Advanced Python, and Python Exercises, MIT, 2012.
[6] I. Zhirkov, Low-Level Programming: C. Assembly, and
Program Execution on Intel 64 Architecture, Apress ,
2017.

View publication stats

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