Sunteți pe pagina 1din 6

Sortari de tablouri

Aplicatia 1
Se da un fisier continand date despre rezultatele unor elevi la admiterea in liceu. Acest fisier poate
fi descarcat aici. Fisierul contine 10.000 de linii, fiecarui elev revenindu-i 2 linii consecutive din
fisier. Pe prima linie din cele doua se afla numele elevului iar pe cea de a doua se afla media de
intrare sub forma unui numar real intre 1.0 si 10.0. Cunoscand ca sunt in total 5.000 de elevi si ca
numele nici unui elev nu ocupa mai mult de 35 de caractere, se cere:

Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma < nume ,
medie >

Utilizand algoritmul de sortare prin selectie (SelSort), sa se afiseze elevii crescator si apoi
descrescator, in ordinea mediilor si sa se contorizeze comparatiile si atribuirile care se fac in
timpul sortarii

Utilizand algoritmul de sortare prin interschimbare (BubbleSort), sa se afiseze elevii


crescator si apoi descrescator, in ordinea numelor si sa se contorizeze comparatiile si
atribuirile care se fac in timpul sortarii

Functii de biblioteca indicate a fi folosite in implementarea C (mai multe detalii se pot afla
consultand documentatia online):

fopen - folosita pentru deschiderea unui fisier

fclose - folosita pentru inchiderea unui fisier

fgets - folosita pentru citirea unei linii dintr-un fisier deschis in citire

fscanf - folosita pentru citirea formatata (de date numerice, de exemplu) dintr-un fisier
deschis in citire

strcpy - folosita pentru a crea o copie a unui sir de caractere

strcmp - folosita pentru a compara lexicografic doua siruri de caractere

Codul algoritmilor este dat mai jos.


Toti algoritmii sorteaza crescator.
#define N 5000
int tab[ N ]; /* tabloul de lucru */
void sel_sort()
{
int i , j , k;
int x;
for ( i = 0 ; i < N - 1 ; i++ )
{
k = i;
x = tab[ i ];
for ( j = i + 1 ; j < N ; j++ )
if ( tab[ j ] < x )
{

x = tab[ j ];
k = j;
}
tab[ k ] = tab[ i ];
tab[ i ] = x;
}
}
void bubble_sort()
{
int i , j;
int aux;
for ( i = 1 ; i < N - 1 ; i++ )
for ( j = N - 1 ; j >= i ; j-- )
if ( tab[ j - 1 ] > tab[ j ] )
{
aux = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = aux;
}
}

Sortari de tablouri
Aplicatia 2
Se da un fisier continand date despre angajatii unei companii. Acest fisier poate fi descarcat aici.
Fisierul contine 10.000 de linii, fiecarui angajat revenindu-i 2 linii consecutive din fisier. Pe prima
linie din cele doua se afla numele angajatului iar pe cea de a doua se afla salarul acestuia in dolari,
sub forma unui numar intreg intre 2.000 si 6.999. Cunoscand ca sunt in total 5.000 de angajati si
ca numele nici unui angajat nu ocupa mai mult de 30 de caractere, se cere:

Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma < nume ,
salar >

Utilizand algoritmul de sortare prin insertie (InsertSort), sa se afiseze angajatii crescator si


apoi descrescator, in ordinea salariilor si sa se contorizeze comparatiile si atribuirile care se
fac in timpul sortarii

Utilizand algoritmul de sortare prin amestecare (ShakerSort), sa se afiseze angajatii


crescator si apoi descrescator, in ordinea numelor si sa se contorizeze comparatiile si
atribuirile care se fac in timpul sortarii

Functii de biblioteca indicate a fi folosite in implementarea C (mai multe detalii se pot afla
consultand documentatia online):

fopen - folosita pentru deschiderea unui fisier

fclose - folosita pentru inchiderea unui fisier

fgets - folosita pentru citirea unei linii dintr-un fisier deschis in citire

fscanf - folosita pentru citirea formatata (de date numerice, de exemplu) dintr-un fisier
deschis in citire

strcpy - folosita pentru a crea o copie a unui sir de caractere

strcmp - folosita pentru a compara lexicografic doua siruri de caractere

Codul algoritmilor este dat mai jos.


Toti algoritmii sorteaza crescator.
#define N 5000
int tab[ N ]; /* tabloul de lucru */
void insert_sort()
{
int i , j;
int x;
for ( i = 1 ; i < N ; i++ )
{
x = tab[ i ];
j = i - 1;
while ( j >= 0 && tab[ j ] > x )
{
tab[ j + 1 ] = tab[ j ];
j--;
}
tab[ j + 1 ] = x;
}
}
void shaker_sort()
{
int j , k , l , r;
int x;
l = 1;
r = N - 1;
k = N - 1;
do
{
for ( j = r ; j >= l ; j-- )
if ( tab[ j - 1 ] > tab[ j ] )
{
x = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = x;
k = j;
}
l = k + 1;
for ( j = l ; j <= r ; j++ )
if ( tab[ j - 1 ] > tab[ j ] )
{
x = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = x;
k = j;
}
r = k - 1;
} while ( l <= r );
}

Sortari de tablouri
Aplicatia 3
Se da un fisier continand date despre membrii unui partid. Acest fisier poate fi descarcat aici.
Fisierul contine 10.000 de linii, fiecarui membru revenindu-i 2 linii consecutive din fisier. Pe prima
linie din cele doua se afla numele membrului iar pe cea de a doua se afla varsta acestuia sub forma
unui numar intreg intre 22 si 71. Cunoscand ca sunt in total 5.000 de membri si ca numele nici
unui membru nu ocupa mai mult de 30 de caractere, se cere:

Sa se citeasca datele din fisier intr-un tablou de 5.000 elemente de forma < nume , varsta
>

Utilizand algoritmul de sortare prin selectie (SelSort), sa se afiseze membrii crescator si


apoi descrescator, in ordinea varstei si sa se contorizeze comparatiile si atribuirile care se
fac in timpul sortarii

Utilizand algoritmul de sortare prin amestecare (ShakerSort), sa se afiseze membrii


crescator si apoi descrescator, in ordinea numelor si sa se contorizeze comparatiile si
atribuirile care se fac in timpul sortarii

Functii de biblioteca indicate a fi folosite in implementarea C (mai multe detalii se pot afla
consultand documentatia online):

fopen - folosita pentru deschiderea unui fisier

fclose - folosita pentru inchiderea unui fisier

fgets - folosita pentru citirea unei linii dintr-un fisier deschis in citire

fscanf - folosita pentru citirea formatata (de date numerice, de exemplu) dintr-un fisier
deschis in citire

strcpy - folosita pentru a crea o copie a unui sir de caractere

strcmp - folosita pentru a compara lexicografic doua siruri de caractere

Codul algoritmilor este dat mai jos.


Toti algoritmii sorteaza crescator.
#define N 5000
int tab[ N ]; /* tabloul de lucru */
void sel_sort()
{
int i , j , k;
int x;
for ( i = 0 ; i < N - 1 ; i++ )
{
k = i;
x = tab[ i ];
for ( j = i + 1 ; j < N ; j++ )
if ( tab[ j ] < x )
{
x = tab[ j ];
k = j;

}
tab[ k ] = tab[ i ];
tab[ i ] = x;
}
}
void shaker_sort()
{
int j , k , l , r;
int x;
l = 1;
r = N - 1;
k = N - 1;
do
{
for ( j = r ; j >= l ; j-- )
if ( tab[ j - 1 ] > tab[ j ] )
{
x = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = x;
k = j;
}
l = k + 1;
for ( j = l ; j <= r ; j++ )
if ( tab[ j - 1 ] > tab[ j ] )
{
x = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = x;
k = j;
}
r = k - 1;
} while ( l <= r );
}

Sortari de tablouri
Aplicatia 4
Se da un fisier continand date despre abonatii unei firme de telefonie mobila. Acest fisier poate fi
descarcat aici. Fisierul contine 10.000 de linii, fiecarui abonat revenindu-i 2 linii consecutive din
fisier. Pe prima linie din cele doua se afla numele abonatului iar pe cea de a doua se afla numarul
de telefon al acestuia, sub forma unui numar intreg lung (long) intre 723456789 si 723461788.
Cunoscand ca sunt in total 5.000 de abonati si ca numele nici unui abonat nu ocupa mai mult de 40
de caractere, se cere:

Sa se citeasca datele din fisier intr-un tablou de 5.000 elemente de forma < nume , telefon
>

Utilizand algoritmul de sortare prin insertie (InsertSort), sa se afiseze abonatii crescator si


apoi descrescator, in ordinea numerelor de telefon si sa se contorizeze comparatiile si
atribuirile care se fac in timpul sortarii

Utilizand algoritmul de sortare prin interschimbare (BubbleSort), sa se afiseze abonatii


crescator si apoi descrescator, in ordinea numelor si sa se contorizeze comparatiile si
atribuirile care se fac in timpul sortarii

Functii de biblioteca indicate a fi folosite in implementarea C (mai multe detalii se pot afla
consultand documentatia online):

fopen - folosita pentru deschiderea unui fisier

fclose - folosita pentru inchiderea unui fisier

fgets - folosita pentru citirea unei linii dintr-un fisier deschis in citire

fscanf - folosita pentru citirea formatata (de date numerice, de exemplu) dintr-un fisier
deschis in citire

strcpy - folosita pentru a crea o copie a unui sir de caractere

strcmp - folosita pentru a compara lexicografic doua siruri de caractere

Codul algoritmilor este dat mai jos.


Toti algoritmii sorteaza crescator.
#define N 5000
int tab[ N ]; /* tabloul de lucru */
void insert_sort()
{
int i , j;
int x;
for ( i = 1 ; i < N ; i++ )
{
x = tab[ i ];
j = i - 1;
while ( j >= 0 && tab[ j ] > x )
{
tab[ j + 1 ] = tab[ j ];
j--;
}
tab[ j + 1 ] = x;
}
}
void bubble_sort()
{
int i , j;
int aux;
for ( i = 1 ; i < N - 1 ; i++ )
for ( j = N - 1 ; j >= i ; j-- )
if ( tab[ j - 1 ] > tab[ j ] )
{
aux = tab[ j - 1 ];
tab[ j - 1 ] = tab[ j ];
tab[ j ] = aux;
}
}

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