HELP!! QUICK-SORT

di il
22 risposte

22 Risposte - Pagina 2

  • Re: HELP!! QUICK-SORT

    In c gli array vengono passati alle funzioni tramite il loro pointer e non per tutti i loro valori:
    void visualizza(int vet[size])
    dichiarala come
    oid visualizza(int *vet)

    Inoltre ho visto che hai messo una parantesi graffa di troppo in fondo al codice.
  • Re: HELP!! QUICK-SORT

    maffo95 ha scritto:


    Sto cercando di creare, nel linguaggio C, il programma quick-sort in maniera ricorsiva.
    Ho scritto il codice e a livello logico mi torna tutto solo che quando faccio partire il programma mi fa solo aggiungere gli elementi all'array e poi mi da errore...

    il codice è il seguente:
    #include <stdio.h>
    void quicksort (int a[],int p,int r);
    void partition (int a[],int p,int r);
    
    int main () {
    	int i;
    	int *a;
    	int n;
    	printf ("quanti posti ha l'array? ");
    	scanf ("%d",&n);
    	a=(int*)malloc(n*sizeof(int));
    	for (i=0; i<n; i++) {
    		printf ("al posto %d = ",i+1);
    		scanf ("%d",&a[i]);
    	}
    	printf ("\n\n--------------------\n\n");
    	quicksort (a,0,n);
    	for (i=0; i<n; i++) {
    		printf ("ORA al posto %d = %d",i+1,a[i]);
    	}
    return main();
    }
    
    void quicksort (int a[],int p,int r) {
    	int q;
    	if (p<r) {
    	        q=partition(a,p,r);
    		quicksort(a,p,q-1);
    		quicksort(a,q+1,r);
    	}
    }
    
    void partition(int a[],int p,int r) {
    	int x=a[r];
    	int t=p-1;
    	int temp;
    	int j;
    	int q;
    	for (j=p; j<r-1; j++) {
    		if (a[j]<=x) {
    			t++;
    			temp=a[t];
    			a[t]=a[j];
    			a[j]=temp;
    		}
    	}
    	temp=a[t+1];
    	a[t+1]=a[r];
    	a[r]=temp;
    return t+1;
    }
    
    dove ho sbagliato??
    la funzione partition torna una int e tu l'hai dichiarata void. questo sicuramente ti darà "solo" dei warning in compilazione ma ti sballa il funzionamento.
  • Re: HELP!! QUICK-SORT

    Matteo quel problema lì l'ho già risolto il problema e compilarlo l'ho compilato senza problemi l'unico problema che è rimasto è quello che avevo scritto ieri cioè:

    maffo95 ha scritto:


    carico l'array e poi mi da un array parzialmente ordinato dove:
    -se l'array è dispari mi mette tutto in ordine solo che fa sparire il numero massimo inserito nell'array mettendo al primo posto zero

    -se l'array è pari peggio ancora, il secondo numero più piccolo sparisce il terzultimo e penultimo si scanbiano di posto (cioè il massimo va al terzultimo mentre il secondo massimo va al penultimo posto) e all'ultimo posto c'è un numerone (che penso sia una posizione)
    potete dare un'occhiata al codice che ho compilato e vedere dove sta l'errore??
    il codice è questo:
    #include <stdio.h>
    void quicksort (int a[],int p,int r);
    int partition (int a[],int p,int r);
    
    int main () {
    	int i;
    	int *a;
    	int n;
    	printf ("quanti posti ha l'array? ");
    	scanf ("%d",&n);
    	a=(int*)malloc(n*sizeof(int));
    	for (i=0; i<n; i++) {
    		printf ("al posto %d = ",i+1);
    		scanf ("%d",&a[i]);
    	}
    	printf ("\n\n--------------------\n\n");
    	quicksort (a,0,n);
    	for (i=0; i<n; i++) {
    		printf ("ORA al posto %d = %d\n",i+1,a[i]);
    	}
    	printf ("\n\n--------------------\n\n");
    return 0;
    }
    
    void quicksort (int a[],int p,int r) {
    	int q;
    	if (p<r) {
    	    q=partition(a,p,r);
    		quicksort(a,p,q-1);
    		quicksort(a,q+1,r);
    	}
    }
    
    int partition(int a[],int p,int r) {
    	int x=a[r];
    	int t=p-1;
    	int temp;
    	int j;
    	for (j=p; j<r-1; j++) {
    		if (a[j]<=x) {
    			t++;
    			temp=a[j];
    			a[j]=a[t];
    			a[t]=temp;
    		}
    	}
    	temp=a[t+1];
    	a[t+1]=a[r];
    	a[r]=temp;
    return t+1;
    }
    
    P.S. non ci sono graffe in più
  • Re: HELP!! QUICK-SORT

    Return main() ?

    La main non deve essere ricorsiva ... perché la richiami?
  • Re: HELP!! QUICK-SORT

    È per ricominciare la procedura per fare più prove per capire l'errore dove sta...Ribadisco che non è quello l'errore (e ora l'ho modificato ma come avevo già detto l'errore persiste).
  • Re: HELP!! QUICK-SORT

    La prima assegnazione di partition è fuori array, quindi, senza neanche seguire la logica, l'istruzione è sicuramente errata e va ad assegnare a x un valore a caso fuori dall'array.

    int x=a[r];

    Infatti alla prima chiamata di quicksort viene passata n che viene passata come r, ma l'array a va da 0 a n-1.

    Probabilmente sarebbe corretto:

    int x = a[r - 1];
  • Re: HELP!! QUICK-SORT

    Non è quello...ho anche provato ma non tornerebbe al livello logico r=n (dell'array) non va fuori array anzi va a prendere l'ultimo valore e lo confronta con tutti gli altri...
  • Re: HELP!! QUICK-SORT

    Magari logicamente non è quello che vuoi, ma sicuramente alla prima iterazione vai ad usare un valore indeterminato. Infatti, con la scanf, carichi fino a a[n-1]. anche la malloc di restituisce n elementi, da 0 a n-1.
    Prova a stampare il valore di x prima del for dentro a partition.
    Vedrai che il primo valore stampato (della prima chiamata) non è l'ultimo che hai immesso ma un valore a caso, probabilmente 0 ma potrebbe essere qualsiasi valore e sicuramente non l'ultimo che hai digitato.
    Un suggerimento, usa molte printf per stampare i valori dellle variabili durante l'esecuzione e verifica che i valori stampati siano quelli attesi.
Devi accedere o registrarti per scrivere nel forum
22 risposte