Autore |
Discussione  |
|
Dr House
Utente medio
 
Città: Bari
|
Inserito il - 09/01/2008 : 15:22:20
|
Cerco disperato qualcuno che mi possa aiutare con l'algoritmo merge sort. Sintatticamente è corretto ma non mi restituisce il vettore ordinato bensi il vettore come è all'inizio. Ho pensato che forse c'è qualche errore nella copiatura dal vettore c al vettore a o nella visualizzazione ma non riesco a venirne a capo. C'è qualcuno che riesce a capire dov'è l'errore. Tra l'altro il controllo non arriva all'ultima riga della funzione merge o cosi mi sembra. Aiutatemi...please
#include<stdio.h> #define DIM 20 int leggi_num(int *); void leggi_vet(int [],int ); void visualizza_vet(int [],int ); void msort (int[],int ,int ); void merge (int[],int,int,int); int main() { int a[DIM]; int n; int i,j; printf("Inserire il numero delle componenti del vettore\n"); leggi_num(&n); printf("Inserire le %d componenti del vettore\n", n); leggi_vet(a,n); printf("Il vettore digitato e'\n"); visualizza_vet(a,n); printf("\n"); i=0; j=n-1; msort(a,i,j); printf("Il vettore ordinato e'\n"); visualizza_vet(a,n); system("pause"); return 0; } int leggi_num(int *x) { scanf("%d",x); } void leggi_vet(int x[],int n) { int i; for(i=0;i<n;i++) scanf("%d",&x[i]); } void visualizza_vet(int x[],int m) { int i; for(i=0;i<m;i++) printf("%d ",x[i]); } void msort (int x[],int i,int j) { // ordina le componenti di x comprese tra x[i] e x[j] // m indice dell'elemento centrale int m,n,t; if (i+1==j) // caso assiomatico-il vettore ha solo 2 componenti { if (x[i]>x[j]) { t=x[i]; x[i]=x[j]; x[j]=t; } else { if(i+1<j) // il vettore ha più di due componenti { m=(i+j)/2; msort(x,i,m); msort(x,m+1,j); merge(x,i,m,j); } // se (i+1>j il vettore ha un solo elemento } } } void merge (int a[],int inf,int med,int sup) { // fusione dei vettori di indici inf...med; med+1...sup int c[70]; // vettore di lavoro int i,j,k; i=inf;j=med+1;k=inf; // inizializza i,j,k while ((i<=med)&&(j<=sup)) { if (a[i]<=a[j]) // confronta a[i] e a[j] { c[k]=a[i]; i++; k++; } else { c[k]=a[j]; j++; k++;} } // completa il vettore c con gli elementi restanti di a while(i<=med) { c[k]=a[i]; i++; k++; } // completa il vettore c con gli elementi restanti di b while(j<=sup) { c[k]=a[j]; j++; k++; } // copia gli elementi di c in a for(k=inf;k<=sup;k++) a[k]=c[k]; printf("vettore c\n"); visualizza_vet(c,k); }
|
"La realtà è fatta di cose vere e cose supposte. Le cose vere le mettiamo da parte, ma le supposte dove le mettiamo?" |
|
giaefre
Nuovo Utente
|
Inserito il - 25/01/2008 : 18:03:48
|
Ti so dire per certo che questo algoritmo funziona.... --header : void unisciarray(int array1[] , int array2[] , int arraytot[]); --procedura: void unisciarray( int array1[] , int array2[] , int arraytot[])
{ int i=0 ,j=0,c=0;
while ((i < size) && (j < size)) {
if (array1[i] < array2[j])
{ arraytot[c] = array1[i] ; c++ ; i++ ;}
else
{ arraytot[c] = array2[j] ; c++ ; j++ ;} }
while (i < size)
{ arraytot[c] = array1[i] ; i++ ; c++; }
while (j < size)
{ arraytot[c] = array2[j] ; j++ ; c++; }
}
Spero di esserti stato d'aiuto seppur in minima parte p.s la prossima volta...indenta ! |
 |
|
|
Discussione  |
|
|
|