Informatiile acestui spatiu sunt gratuite. Observatii si sugestii pot fi trimise pe adresa de contact sau pe forum.

     Divide et Impera

Metoda Divide et Impera este o tehnică de programare ce presupune împărțirea unei probleme mai mari în subprobleme mai mici care se pot rezolva mai ușor, urmată de rezolvarea acestora in mod recursiv, iar, în final, prin combinarea soluțiilor subproblemelor se ajunge la soluția problemei inițiale.

Principiul de funcționare

  1. Divide (împarte): Problema inițială este împărțită în mai multe subprobleme mai mici, de acelasi tip. Procesul de împărțire continuă, fiecare subproblema fiind la rândul ei împărțită în mai multe subprobleme mai mici până când se ajunge la o problemă suficient de simplă pentru a fi rezolvată direct.
  2. Conquer (Rezolvă): Se rezolvă fiecare subproblemă, fie recursiv, daca este o problemă suficient de mare, fie direct, dacă am ajuns la un caz de bază care poate fi rezolvat simplu. (Exemplu: În căutarea binară căutarea se face recursiv doar într-una dintre jumătățile intervalului.)
  3. Combine (Combină): Rezultatele obținute ca soluții ale subproblemelor se combină, formându-se astfel soluția problemei inițiale.

Exemplu:

Să se sordoneze crescător un vector de N numere naturale prin metoda interclasării (Merge Sort):.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

91
92
#include using namespace std;

// Funcția de interclasare (Merge)
void merge(int arr[], int left, int mid, int right)
{
   int n1 = mid - left + 1;
   int n2 = right - mid;
  
   // Creăm două subșiruri temporare
   int L[n1], R[n2];
  
   // Copiem datele în subșirurile temporare
   for (int i = 0; i < n1; i++)
   L[i] = arr[left + i];
   for (int i = 0; i < n2; i++)
   R[i] = arr[mid + 1 + i];
  
   // Interclasăm subșirurile înapoi în arr[]
   int i = 0, j = 0, k = left;
   while (i < n1 && j < n2)
   {
     if (L[i] <= R[j])
     {
       arr[k] = L[i];
       i++;
     } else
     {
       arr[k] = R[j];
       j++;
     }
     k++;
   }
  
   // Copiem elementele rămase din L[]
   while (i < n1)
   {
     arr[k] = L[i];
     i++;
     k++;
   }
  
   // Copiem elementele rămase din R[]
   while (j < n2)
   {
     arr[k] = R[j];
     j++;
     k++;
   }
}

// Funcția de sortare Merge Sort
void mergeSort(int arr[], int left, int right)
{
   if (left < right)
   {
     int mid = left + (right - left) / 2;
    
     // Sortăm partea stângă
     mergeSort(arr, left, mid);
    
     // Sortăm partea dreaptă
     mergeSort(arr, mid + 1, right);
    
     // Combinăm cele două jumătăți sortate
     merge(arr, left, mid, right);
   }
}

int main()
{
   int n;
  
   // Citim numărul de elemente
   cout << "Introduceti numarul de elemente: ";
   cin >> n;
  
   int arr[n];
  
   // Citim elementele array-ului
   cout << "Introduceti elementele: ";
   for (int i = 0; i < n; i++)
      cin >> arr[i];
  
   // Apelăm Merge Sort
   mergeSort(arr, 0, n - 1);
  
   // Afișăm array-ul sortat
   cout << "Array-ul sortat: ";
   for (int i = 0; i < n; i++)
     cout << arr[i] < " ";
  
   return 0;
}
Intruduceti numarul de elemente ale vectorului: 6
Introduceti elementele (despartite de spatiu): 3 5 1 7 6 9
Array-ul sortat: 1 3 5 6 7 9