Advertisement
fcamuso

Algoritmi lezione 21 merge sort

Apr 24th, 2024 (edited)
721
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.68 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <ctime>
  4. #include <chrono>
  5.  
  6. using namespace std;
  7. #include "../../min_max/utility_vettori.h"
  8.  
  9. void merge(unsigned long v[], int inizio, int centrale, int fine)
  10. {
  11.   int i=inizio;
  12.   int j=centrale+1;
  13.  
  14.   int k=0;
  15.   unsigned long *fusione = new unsigned long[fine-inizio+1];
  16.  
  17.   //finchè una delle due metà non è esaurita ...
  18.   while (i<=centrale && j<=fine)
  19.   {
  20.     if (v[i]<=v[j])
  21.     {
  22.        fusione[k] = v[i];
  23.        i++;
  24.     }
  25.     else
  26.     {
  27.       fusione[k] = v[j];
  28.       j++;
  29.     }
  30.  
  31.     k++;
  32.   }
  33.  
  34.   //se si è esaurita la metà di sinistra, copia i rimasti a destra
  35.   while(i<=centrale)
  36.   {
  37.     fusione[k] = v[i];
  38.     i++; k++;
  39.   }
  40.  
  41.   //se si è esaurita la metà di dedstra, copia i rimasti a sinistra
  42.   while(j<=fine)
  43.   {
  44.     fusione[k] = v[j];
  45.     j++; k++;
  46.   }
  47.  
  48.   //ricopiamo la sequenza in ordine nella sezione
  49.   //del vettore che occupavano
  50.   for (int i=inizio; i<=fine; i++)
  51.     v[i] = fusione[i-inizio];
  52.  
  53.   delete[] fusione;
  54.  
  55.  
  56. }
  57.  
  58. void merge_sort(unsigned long v[], int inizio, int fine)
  59. {
  60.   if (inizio<fine)
  61.   {
  62.     //divide et impera
  63.     int centrale = (inizio+fine)/2;
  64.     merge_sort(v, inizio, centrale );
  65.     merge_sort(v, centrale+1, fine);
  66.  
  67.     //fusione delle due metà ordinate
  68.     merge(v, inizio, centrale, fine);
  69.   }
  70. }
  71.  
  72. const int QUANTI_ELEMENTI = 2000000;
  73. unsigned long v[QUANTI_ELEMENTI];
  74.  
  75. int main()
  76. {
  77.     carica_vettore_interi(v, QUANTI_ELEMENTI);
  78.  
  79.     Cronometro(Stato::START);
  80.     merge_sort(v, 0, QUANTI_ELEMENTI-1);
  81.     cout << Cronometro(Stato::STOP) << endl;
  82.     if (verifica_ordine_crescente(v, QUANTI_ELEMENTI))
  83.       cout << "Ordinato!\n";
  84.     return 0;
  85. }
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement