|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Feb 2006
Città: AQ
Messaggi: 2787
|
preparando fond inf 2... problema merge sort...
salve a tutti!
mi sto dando alla pazza gioia con quelle 6-7-8 ore al giorno di informatica 2 causa esami... e sono arrivato al fatidico merge sort. Il linguaggio è il c++, l'algoritmo è il merge sort creato per evitare troppa occupazione in memoria centrale (comunque buono per dim input < 10^6). Codice:
#include<stdlib.h> #include<iostream> #include<string.h> #include<conio.h> using namespace std; const int n_max=1000; typedef int tipo_elementi; struct tipo_insieme{ tipo_elementi elementi[n_max]; int lunghezza; }; tipo_insieme I,I1,I2; void creainsieme(tipo_insieme &Insieme) { cout<<"inserisci il numero di elementi dell'insieme "; cin>>Insieme.lunghezza; for(int i=0;i<Insieme.lunghezza;i++) { cout<<"inserisci l'elemento "<<i<<" "; cin>>Insieme.elementi[i]; } } void merge(tipo_insieme insieme1,tipo_insieme insieme2,tipo_insieme &insieme) { int k=0,j=0,i=0; while((i<insieme1.lunghezza)&&(j<insieme2.lunghezza)) { if(insieme1.elementi[i]<insieme2.elementi[j]) {insieme.elementi[k]=insieme1.elementi[i]; i++;} else { insieme.elementi[k]=insieme2.elementi[j]; j++; } k++; } while(i<insieme1.lunghezza) { insieme.elementi[k]=insieme1.elementi[i]; i++;k++;} while(j<insieme2.lunghezza) { insieme.elementi[k]=insieme2.elementi[j]; j++;k++;} insieme.lunghezza=k; } void mergesort(tipo_insieme &seq) { tipo_insieme seq1,seq2; if (seq.lunghezza!=1) { seq1.lunghezza=(seq.lunghezza/2); if(seq.lunghezza==(seq1.lunghezza*2)) seq2.lunghezza=(seq.lunghezza/2); else seq2.lunghezza=(seq.lunghezza/2)+1; for(int i=0;i<seq1.lunghezza;i++) seq1.elementi[i]=seq.elementi[i]; //cout<<seq1.lunghezza<<" j "<<seq2.lunghezza<<" "; stampa di controllo for(int i=0;i<seq2.lunghezza;i++) seq2.elementi[i]=seq.elementi[i+seq1.lunghezza]; mergesort(seq1); mergesort(seq2); merge(seq1,seq2,seq); } } void stampainsieme(tipo_insieme Insieme1) { for (int i=0;i<Insieme1.lunghezza;i++) cout<<" "<<Insieme1.elementi[i]; cout<<endl; } int main() { creainsieme(I1); mergesort(I1); stampainsieme(I1); system("pause"); return 0; } ora, da quello che ho capito io in pratica il sistema merge-sort prende un array di dimensione n ed, in maniera ricorsiva, lo divide in due (quindi i due array vengono divisi in due, che vengono ridivisi in due e così via) fino ad avere n variabili allocate corrispondenti agli n elementi dell'array. dopo di ciò prende e comincia a fondere: risalendo "sull'albero" appena creato prende prima due elementi adiacenti, li ordine e li fonde, e così poi fa con tutti gli altri, e la stessa cosa fa con tutti gli array appena creati, e così via fino ad avere due unici array di dimensione n/2, già ordinati al loro interno, che vengono fusi ed ordinati... il ragionamento - spero - sia questo. c'è solo un problema: NON SO COSA SUCCEDE A LIVELLO DI CODICE..... nel senso, non è che non riesco ad interpretare quanto scritto sopra, ma non ne riesco ad avere la visione d'insieme... e avrei bisogno che quale pia pia ma tanto pia persona mi dica, su un esempio, chessò, di un array di dimensione 5 o 6 cosa succeda passo passo ad ogni attivazione (naturalmente parlo del merge sort... la funzione leggi e stampa le so interpretare...). mi sapreste aiutare? please... grazie al santo/santi che mi daranno una mano ![]()
__________________
Acer 3820TG Codice:
Ho venduto a: 23answer23, clamasa, salsero71, nik4, lollo_79, Star, krystis, tari80, BananaFlanders, froZZen, Perfavore83, Holy_knight; Ho comprato da: kikki2, ThE cX MaN, PantWeb, robby85, aldarev, markese, Drago, NLDoMy, Hells, Dragonx21, axlaxl, Homer314, e tanti tanti altri :) |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
|
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Feb 2006
Città: AQ
Messaggi: 2787
|
già visto... purtroppo l'articolo su wikipedia non risponde alla mia domanda, ovvero non spiega per bene cosa accade ad ogni attivazione...
__________________
Acer 3820TG Codice:
Ho venduto a: 23answer23, clamasa, salsero71, nik4, lollo_79, Star, krystis, tari80, BananaFlanders, froZZen, Perfavore83, Holy_knight; Ho comprato da: kikki2, ThE cX MaN, PantWeb, robby85, aldarev, markese, Drago, NLDoMy, Hells, Dragonx21, axlaxl, Homer314, e tanti tanti altri :) |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Ma un compilatore per eseguire il debug passo passo no?
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Feb 2006
Città: AQ
Messaggi: 2787
|
no...devo proprio capirlo per bene a livello teorico, per essere in grado poi di utilizzarlo per bene...
__________________
Acer 3820TG Codice:
Ho venduto a: 23answer23, clamasa, salsero71, nik4, lollo_79, Star, krystis, tari80, BananaFlanders, froZZen, Perfavore83, Holy_knight; Ho comprato da: kikki2, ThE cX MaN, PantWeb, robby85, aldarev, markese, Drago, NLDoMy, Hells, Dragonx21, axlaxl, Homer314, e tanti tanti altri :) Ultima modifica di casacup : 08-03-2007 alle 11:59. |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Per capirlo a livello teorico ti basta studiare il merge sort su un qualunque manuale, se vuoi capire il funzionamento passo passo del codice (come chiedevi) ti serve un compilatore, una spiegazione a parole non farebbe altro che ricalcare il funzionamento dell'algoritmo scritto su qualunque manuale.
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Feb 2006
Città: AQ
Messaggi: 2787
|
purtroppo sto studiando sul libro scritto dal prof... nel quale il merge è spiegato abbastanza bene, il merge sort invece non ha neanche una riga di spiegazione (riferendomi a quello riportato basato sugli indici)... ecco, in particolare è sugli indici che mi impiccio...
__________________
Acer 3820TG Codice:
Ho venduto a: 23answer23, clamasa, salsero71, nik4, lollo_79, Star, krystis, tari80, BananaFlanders, froZZen, Perfavore83, Holy_knight; Ho comprato da: kikki2, ThE cX MaN, PantWeb, robby85, aldarev, markese, Drago, NLDoMy, Hells, Dragonx21, axlaxl, Homer314, e tanti tanti altri :) |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:10.