darkjessy94

mergesort - SalvDC

Oct 12th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <stdlib.h>
  4. using namespace std;
  5. ///Procedure
  6. ///NB: Con c++11 il nome merge non crea conflitto con la funzione merge()!
  7. void merge(vector <int>& v, int destra, int centro, int sinistra) {
  8. vector <int> aux; ///Creo un vettore
  9. aux.resize(sinistra+1); ///Assegno al vettore dimensione sx+1 (tutti gli elementi +1)
  10. int i,j;
  11. for (i = centro+1; i > destra; i--) ///Scorri dalla posizione centro+1 fino all'inizio dell'array
  12. aux.at(i-1) = v.at(i-1); ///Carica gli elementi in maniera simmetrica rispetto agli elementi del vector in entrata
  13. for (j = centro; j < sinistra; j++) ///Scorri dalla posizione centro fino alla fine dell'array
  14. aux.at(sinistra+centro-j) = v.at(j+1); ///Carica gli elementi a partire dal fondo della porzione + centro - j '1° passo parte dell'estremo - 2° passo estremo - 1....' e caricali nell'array partendo dalla posizione successiva al centro
  15. for (int k = destra; k <= sinistra; k++) ///Scorri dall'inizio alla fine
  16. if (aux.at(j) < aux.at(i)) ///Se l'elemento aux[j]<aux[i] RICORDA: i vale dx all'uscita del primo ciclo e j vale sx dall'uscita del secondo ciclo, sto confrontando i due estremi di aux!
  17. v.at(k) = aux.at(j--); ///Carica in v l'elemento minore
  18. else
  19. v.at(k) = aux.at(i++); ///Carica in v l'elemento minore
  20. ///Piccola nota
  21. ///Non ho necessità di deallocare il contenitore Vector poichè il loro scopo è proprio quello di allontanare il programmatore da eventuali errori che hanno a che fare con un uso improprio della memoria
  22. }
  23. void mergesort(vector <int>& a, int destra, int sinistra) {
  24. if (destra<sinistra) { ///Divido finchè non arrivo alla singola unità
  25. int centro = (destra+sinistra)/2; ///Trova il centro
  26. mergesort(a, destra, centro); ///Scendi nella parte destra
  27. mergesort(a, centro+1, sinistra); ///Scendi nella parte sinistra
  28. merge(a, destra, centro, sinistra); ///Ordina le sotto-porzioni
  29. }
  30. }
  31.  
  32. void impera(vector <int> a,vector <int> b,vector <int>&c)
  33. {
  34. int i=0,j=0;
  35. while(i<a.size()&&j<b.size()) ///Scorri finche uno dei 2 vettori 'a' e 'b' non è terminato
  36. {
  37. if(a.at(i)<b.at(j)) ///Determina il più piccolo tra i due elementi confrontati
  38. c.push_back(a.at(i++)); ///Carica il dato in 'c'
  39. else
  40. c.push_back(b.at(j++)); ///Carica il dato in 'c'
  41. }
  42. ///A questo punto uno dei due vettori è terminato allora:
  43.  
  44. while(i<a.size()) ///Se ci sono ancora elementi di 'a'
  45. c.push_back(a.at(i++)); ///Carica il dato in 'c'
  46.  
  47. while(j<b.size()) ///Se ci sono ancora elementi di 'b'
  48. c.push_back(b.at(j++)); ///Carica il dato in 'c'
  49. }
  50. int main()
  51. {
  52. vector <int> a={10,9,8,7,6,5}; ///Vector pre-caricato da ordinare
  53. vector <int> b={11,21,35,3,1}; ///Vector pre-caricato da ordinare
  54. vector <int> c; ///Vector da creare con a + b
  55. mergesort(a,0,a.size()-1); ///Ordino a
  56. mergesort(b,0,b.size()-1); ///Ordino b
  57. cout<<"\tBenvenuto nel Programma 'MERGE SORT'"<<endl<<endl;;
  58. cout<<"Il vettore 'a' ordinato \x82:";
  59. for(auto x:a) ///Scorro il vettore a con un Range-For
  60. cout<<" "<<x;
  61. cout<<endl;
  62. cout<<"Il vettore 'b' ordinato \x82:";
  63. for(auto x:b) ///Scorro il vettore b con un Range-For
  64. cout<<" "<<x;
  65. impera(a,b,c); ///Fondo i due array nell'array c
  66. cout<<endl<<endl<<"Il vettore 'c' fuso tra i vettori 'a' e 'b' \x82:";
  67. for(auto x:c) ///Scorro il vettore c con un Range-For
  68. cout<<" "<<x;
  69. cout<<endl<<endl<<endl;
  70. return 0;
  71. }
Add Comment
Please, Sign In to add comment