Aiuto con il codice "merge-sort"

di il
6 risposte

Aiuto con il codice "merge-sort"

Mi sapreste spiegare in modo semplice e passo passo cosa fa il programma "merge-sort"?
Sarà più specifico...a lezione mi hanno spiegato l'algoritmo e fin li tutto ok poi però quando sono andato a fare il programma ho avuto enormi problemi ma con l'aiuto di internet sono riuscito a crearlo...solo che ho un dubbio riguardo la ricorsione di merge-sort.
questo è il codice del programma per intero:
#include <stdio.h>

void mergesort(int a[], int left, int right);
void merge(int a[], int left, int center, int right);


void main() {
	int n;
	int v[n];
	printf ("inserisci posti array = ");
	scanf ("%d",&n);
	int i;
	for (i=1; i<n+1; i++) {
        printf ("inserisci valore nel posto %d = ",i);
        scanf ("%d",&v[i]);
    }
	mergesort(v, 1, n);
	for (i=1; i<n+1; i++) {
		printf ("l'array ordinato al posto %d = %d\n",i,v[i]);
	}
system ("pause");
}

void mergesort(int a[], int left, int right){                                       //da qui in poi ho problemi                             int center;
	if (left<right){
	center = (left+right)/2;
	mergesort(a, left, center);
	mergesort(a, center+1, right);
	merge(a, left, center, right);
	}
}

void merge(int a[], int left, int center, int right) {
int i, j, k; 
int b[999];
i = left; 
j = center+1; 
k = 0;
	while ((i<=center) && (j<=right)){
		if (a[i] <= a[j]) { 
			b[k] = a[i]; i++; 
		} else { 
			b[k] = a[j]; j++;}
			k++;
		}
	while (i<=center) {
		b[k] = a[i]; 
		i++; 
		k++;
	}
	while (j<=right) {
		b[k] = a[j]; 
		j++;
		k++;
	}

		for (k=left; k<=right; k++)
			a[k] = b[k-left];
}


non capisco che valore viene attribuito a "left" e "right" se io non le l'ho dati in input, e cosa fa di preciso "void merge".
il codice funziona l'ho già compilato, ma dopo aver letto il libro, visto video e svariate discussioni ancora oggi ho questi dubbi.
So che per voi è una cosa semplice e banale (oltre che basilare), ma io sono proprio alle primissime armi e spero voi mi possiate togliere questi infernali dubbi
Attendo vostre notizie e grazie in anticipo.

6 Risposte

  • Re: Aiuto con il codice "merge-sort"

    Che compilatore usi?
  • Re: Aiuto con il codice "merge-sort"

    Dev-c++
    ma ripeto il programma funziona è che non capisco il suo funzionamento quando attua la ricorsione e come fa a inizializzare left e right
  • Re: Aiuto con il codice "merge-sort"

    L'idea alla base del merge sort è il divide et impera, che è concettualmente abbastanza semplice: per riordinare un array puoi dividerlo in due metà (divide), ordinare ogni metà riapplicando l'algoritmo (--> ricorsione --> impera) e poi, quando le 2 metà sono ordinate, puoi fonderle (la fusione di 2 array già ordinati è una cosa estremamente semplice, si fa in tempo lineare), tornando ad avere un array con gli stessi elementi di quello di partenza ma ordinato.
    Nota che la ricorsione termina quando ti ritrovi ad avere un array di dimensione uguale ad 1: un array con 1 solo elemento è già banalmente ordinato.

    Quello che fa il tuo programma è esattamente questa cosa (non ho letto il codice, ma mi fido ). Semplicemente il programma divide l'array di partenza (che ha lunghezza right - left) in due metà: una va da left a center (che è il centro dell'array di partenza), l'altra da center+1 a right. Poi applica ad ogni metà il merge sorta ed infine fonde le due metà, che ora sono ordinate
  • Re: Aiuto con il codice "merge-sort"

    http://www.iprogrammatori.it/forum-programmazione/cplusplus/problema-compilatori-help-t23718.html#p8532424

    Non rispondo più a chi non ascolta
  • Re: Aiuto con il codice "merge-sort"

    Grazie mille Della spiegazione chiara e soddisfacente
    Non capisco su cosa hai da ridire vbextreme, ho aperto il link che hai messo e non trovo il nesso con il mio problema...
  • Re: Aiuto con il codice "merge-sort"

    Ti spiega che usare il dev come compilatore è voler essere masochisti
    già la programmazione non è facile,se usi un compilatore buggato rischi di perdere la testa a cercare di capire perchè codici apparentemente giusti diano errori vari e incomprensibili
    io consiglio CodeBlocks,che io uso su Linux ma anche il porting su WIn l'ho provato e non è male
Devi accedere o registrarti per scrivere nel forum
6 risposte