Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- #include <ctime>
- #include <chrono>
- using namespace std;
- #include "../../min_max/utility_vettori.h"
- void merge(unsigned long v[], int inizio, int centrale, int fine)
- {
- int i=inizio;
- int j=centrale+1;
- int k=0;
- unsigned long *fusione = new unsigned long[fine-inizio+1];
- //finchè una delle due metà non è esaurita ...
- while (i<=centrale && j<=fine)
- {
- if (v[i]<=v[j])
- {
- fusione[k] = v[i];
- i++;
- }
- else
- {
- fusione[k] = v[j];
- j++;
- }
- k++;
- }
- //se si è esaurita la metà di sinistra, copia i rimasti a destra
- while(i<=centrale)
- {
- fusione[k] = v[i];
- i++; k++;
- }
- //se si è esaurita la metà di dedstra, copia i rimasti a sinistra
- while(j<=fine)
- {
- fusione[k] = v[j];
- j++; k++;
- }
- //ricopiamo la sequenza in ordine nella sezione
- //del vettore che occupavano
- for (int i=inizio; i<=fine; i++)
- v[i] = fusione[i-inizio];
- delete[] fusione;
- }
- void merge_sort(unsigned long v[], int inizio, int fine)
- {
- if (inizio<fine)
- {
- //divide et impera
- int centrale = (inizio+fine)/2;
- merge_sort(v, inizio, centrale );
- merge_sort(v, centrale+1, fine);
- //fusione delle due metà ordinate
- merge(v, inizio, centrale, fine);
- }
- }
- const int QUANTI_ELEMENTI = 2000000;
- unsigned long v[QUANTI_ELEMENTI];
- int main()
- {
- carica_vettore_interi(v, QUANTI_ELEMENTI);
- Cronometro(Stato::START);
- merge_sort(v, 0, QUANTI_ELEMENTI-1);
- cout << Cronometro(Stato::STOP) << endl;
- if (verifica_ordine_crescente(v, QUANTI_ELEMENTI))
- cout << "Ordinato!\n";
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement