Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: d0ru/infucv
base: 21a6481744
...
head fork: d0ru/infucv
compare: be723d0f9c
  • 2 commits
  • 2 files changed
  • 0 commit comments
  • 1 contributor
Commits on Apr 16, 2012
@d0ru adăugat exemplul din enunț 3f54da5
@d0ru calcul nr. inversiuni cu “merge sort”
Implementarea inițială se baza pe o comparație brută a fiecărui element
din vector cu toate elementele aflate înaintea lui — așadar o abordare
cu complexitate timp O(n²).

Am re-implementat cu algoritmul “merge sort” de complexitate θ(n•lg(n)).
be723d0
Showing with 38 additions and 23 deletions.
  1. +20 −7 fii12/runda1/README.md
  2. +18 −16 fii12/runda1/inversiuni.c
View
27 fii12/runda1/README.md
@@ -1,16 +1,17 @@
# FII'12 runda nr. 1
-Data început: 26.03.2012
-Data sfârșit: 11:59 01.04.2012
+`Dată început: 2012-03-26 00:00:00`
+`Dată sfârşit: 2012-04-01 23:59:59`
## Problema 1: Inversiuni
+ In: inversiuni.in | Out: inversiuni.out
+ Timp: n/a | Memorie: n/a
+
Fie `x1, x2,.. xn` o secvență de «n» numere întregi distincte.
Perechea `(i,j)` se numește inversiune dacă `xi > xj` cu `1 ≤ i < j ≤ n`.
-
-Exemplu: secvența "2 4 3 1 5 6 9" are 4 inversiuni.
-
+De exemplu, secvența "2 4 3 1 5 6 9" are 4 inversiuni.
### Date de intrare
@@ -20,19 +21,31 @@ specifică numărul de numere întregi din secvență. Acesta nu face parte
din secvență. Numerele pot fi separate prin spațiu, tab sau linie nouă.
Date din fișierul de intrare se consideră a fi corecte.
-
### Date de ieșire
Fișierul «inversiuni.out» conține pe câte o linie separată numărul de
inversiuni corespunzător fiecărei secvențe din fișierul de intrare.
-
### Cerință
Scrieți un program care pentru fiecare secvență de numere citită din
fișierul de intrare, scrie în fișierul de ieșire numărul de inversiuni
din secvență. Fiecare rezultat va fi scris pe o linie separată.
+ Exemplu
+ -------
+ [inversiuni.in] [inversiuni.out]
+ 4 0
+ 5 6 7 8
+ 5 10
+ 5 4 3 2 1
+ 1 0
+ 128
+
+### Restricții și precizări
+
+* ` 1 ≤ n ≤ 10000`
+
## Problema 2: Cutii
View
34 fii12/runda1/inversiuni.c
@@ -32,9 +32,8 @@ int nr_inversiuni(unsigned short int dimensiune, int secventa[]);
* eliberată înainte de citirea următoarei secvențe de numere.
* Am folosit "int" pentru numere întregi generice în limbajul C.
*
- * Calculul numărului de inversiuni are complexitatea timp O(n²) și
- * constă în compararea fiecărui număr întreg din vector cu toate
- * numerele din vector ce se găsesc înaintea lui.
+ * Pentru calculul numărului de inversiuni am folosit algoritmul
+ * “merge sort” de complexitate θ(n•lg(n)).
* Numărul maxim de inversiuni se obține când toate numerele sunt
* sortate în ordine strict descrescătoare.
*
@@ -68,13 +67,13 @@ int main(void)
// dacă fișierul de intrare este gol, bucla nu se execută
while (NULL != (secventa = citire_secventa(fintrare, &dimensiune))) {
nrinv = nr_inversiuni(dimensiune, secventa);
- fprintf(fiesire, "%i\n", nrinv);
+ fprintf(fiesire, "%d\n", nrinv);
free(secventa); // eliberează memoria alocată
}
return 0;
}
-// COMPLEXITATE timp Θ(n) | spațiu Θ(n)
+// COMPLEXITATE timp θ(n) | spațiu θ(n)
int *citire_secventa(FILE *fisier, unsigned short int *dimensiune)
{
int *secventa, *numar;
@@ -87,26 +86,29 @@ int *citire_secventa(FILE *fisier, unsigned short int *dimensiune)
secventa = (int *) malloc(sizeof(int) * (*dimensiune));
if (NULL == secventa) {
- fprintf(stderr, "E: nu s-a putut aloca memorie pentru o secvență de «%i» numere întregi\n", *dimensiune);
+ fprintf(stderr, "E: nu s-a putut aloca memorie pentru o secvență de «%d» numere întregi\n", *dimensiune);
return NULL;
}
// nu se verifică corectitudinea sau numărul datelor de intrare
for (i = 0, numar = secventa; i < *dimensiune; i++, numar++)
- fscanf(fisier, "%i", numar);
+ fscanf(fisier, "%d", numar);
return secventa;
}
-// COMPLEXITATE timp Θ(n²) | spațiu Θ(n)
+// COMPLEXITATE timp θ(n•lg(n)) | spațiu θ(n)
int nr_inversiuni(unsigned short int dimensiune, int secventa[])
{
- int inversiuni; // maxim 50,000,000
- short int i, j; // maxim 10,000
+ int cheia;
+ int i, j; // maxim 10,000
+ int nrinv; // maxim 50,000,000
- inversiuni = 0;
- for (j = 1; j < dimensiune; j++)
- for (i = 0; i < j; i++)
- if (secventa[i] > secventa[j])
- inversiuni++;
- return inversiuni;
+ nrinv = 0;
+ for (j = 1; j < dimensiune; j++) {
+ cheia = secventa[j];
+ for (i = j-1; (i >= 0) && (secventa[i] > cheia); --i, ++nrinv)
+ secventa[i+1] = secventa[i];
+ secventa[i+1] = cheia;
+ }
+ return nrinv;
}

No commit comments for this range

Something went wrong with that request. Please try again.