Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [C]ordinamento per selezione ricorsivo non funzionante

    ciao a tutti
    sto studiando un esercizio che chiede di elaborare un ordinamento di un array per selezione er Ricorsivo e strano a dirsi.. non funziona come dovrebbe..


    codice:
      int b[SIZE] = { 20 , 5 , 3 ,4 , 10 , 2 } ;
      int *primo = b ; 
      int *ultimo = &b[SIZE - 1 ] ;
    
      seleziona ( b , primo , ultimo ) ;
    codice:
    void seleziona ( int a [] , int *i , int *n ) 
    
    {
    	int small ;
    	int j ;
    	int temp ;
    
    
    	if ( *i < *(n - 1)  )
    	{
    		small = *i ;
    
    		for ( j  = i+1 ; j <= n ;j++ )
    		
    		if ( a[j] < small )
    
    		{
    		small = j ;
    		temp = small ;
    		small = *i ;
    		*i = temp ;
    
    		
    
    		}
    		seleziona ( a , i+1 , n ) ;
    		
    
    	}
    	
    
    	
    }


    il codice è abbastanza snello direi , ma non funziona come dovrebbe , cioè non effettua
    nessun ordinamento !

    potreste aiutarmi?

    grazie

  2. #2

    Re: [C]ordinamento per selezione ricorsivo non funzionante

    Originariamente inviato da toni00c
    ciao a tutti
    sto studiando un esercizio che chiede di elaborare un ordinamento di un array per selezione er Ricorsivo e strano a dirsi.. non funziona come dovrebbe..


    codice:
      int b[SIZE] = { 20 , 5 , 3 ,4 , 10 , 2 } ;
      int *primo = b ; 
      int *ultimo = &b[SIZE - 1 ] ;
    
      seleziona ( b , primo , ultimo ) ;
    codice:
    void seleziona ( int a [] , int *i , int *n ) 
    
    {
    	int small ;
    	int j ;
    	int temp ;
    
    
            if ( *i < *(n - 1)  ) /* perchè n - 1 ? */ 
    	{
    		small = *i ;
    
    		for ( j  = i+1 ; j <= n ;j++ )
    		
    		if ( a[j] < small )
    
    		{
    		small = j ;
    		temp = small ;
    		small = *i ;
    		*i = temp ;
    
    		
    
    		}
    		seleziona ( a , i+1 , n ) ;
    		
    
    	}
    	
    
    	
    }


    il codice è abbastanza snello direi , ma non funziona come dovrebbe , cioè non effettua
    nessun ordinamento !

    potreste aiutarmi?

    grazie
    A parte che non capisco bene il funzionamento, soprattutto perchè mescoli variabili intere con puntatori ad interi (nel ciclo for con j, i, n)...
    In ogni caso non ti ordina niente semplicemente perchè non entra neanche nella codizione if: *i = 20 e *(n - 1) = 10, * i < *(n - 1) ? No, quindi non entra neanche nelle istruzioni seguenti ed esce senza aver fatto nulla!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  3. #3
    sto tentando di gestire il tutto passando alla funzione
    il vettore , e un puntatore al primo e all'ultimo elemento , ma per ora nulla!

    comunque quel pezzo di codice è sbagliato ,
    sarebbe

    codice:
    if ( *i < *n  )
    ma non entra mai perchè la condizione è falsa di partenza

    riprovo ancora

    grazie

  4. #4

    Re: [C]ordinamento per selezione ricorsivo non funzionante

    Originariamente inviato da toni00c
    codice:
      int b[SIZE] = { 20 , 5 , 3 ,4 , 10 , 2 } ;
      int *primo = b ; 
      int *ultimo = &b[SIZE - 1 ] ;
    Sei sicuro che il l'assegnamento di primo sia corretto???

  5. #5

    Re: Re: [C]ordinamento per selezione ricorsivo non funzionante

    Originariamente inviato da _Alfabetagamma_
    Sei sicuro che il l'assegnamento di primo sia corretto???

    Quello è corretto, perchè scrivere "b" è come scrivere "&b[0]", ossia l'indirizzo del primo elemento dell'array!
    Salute a voi, da Laikius!

    --> Faber est suae quisque fortunae <--

  6. #6
    Mi sa mi sa, che non puoi fare la ricorsione se non c'è una condizione di uscita. Lui la continuerà a fare all'infinito fino a quando non trova il return, che qui è assente

  7. #7
    ciao ragazzi ho fatto un bel casino con quel codice , facendo un po di confusione con l'ordinamento a bolle ;

    questa invece è la "Vera" versione (Iterativa) dell'ordinamento a selezione ;

    vediamo se riusciamo col tempo a fare una ricorsiva

    grazie dell'aiuto

    codice:
    
    void seleziona ( int a [] , int size ) 
    
    {
    	int j ;
    	int i ;
    	int p ;
    	int min ;
    
    
    		for ( i  = 0 ; i < SIZE - 1 ; i++ )
    
    		{
    		min = a[i] ;
    		p = i ;
    
    		for ( j = i + 1 ; j < SIZE ; j++ )
    		{
    
    
    		if ( confronta (a [j] , min ) < 0 )
    		{
    
    		min = a[j] ; 
    		p = j ;
    
    		}
    
    		}
    
    		if (p != i )
    
    		{
    			a[p] = a[i] ;
    		    a[i] = min ;
    		}
    	
    
       
    		}
    		
    		
    
    	}
    
    int confronta ( int x , int y ) 
    {
    	if ( x < y ) 
    		return -1 ;
    
    	else if (x > y ) 
    	return 1 ;
    
    	else return  0 ;
    
    }

  8. #8
    Secondo me l'unico modo possibile per farlo ricorsivo sarebbe una soluzione tipo sommatoria, mi spiego meglio.

    Inanzittuto dovrebbe avere una cosa del tipo

    codice:
    if(ordinato==1) return;
    Una funzione che ad ogni "giro" controlli se l'array sia ordinato e modifichi il valore di ordinato

    E infine (il succo della ricorsione) si potrebbe fare confrontando e invertendo (se necessario) b[i] e b[i+1]

    A questo punto si potrebbe richiamare la funzione al posto che da i, da i+1.

    In "verba" funziona, ma sono gli "scripta" a parlare XD

  9. #9
    ciao sto riflettendo sul problema , ma non penso sia quella la soluzione

    la funzione ricorsiva (suppongo)debba richiamare se stessa fino a quando non raggiunge la fine degli elementi del vettore ( altrimenti ciclerebbe all'infinito)

    chi vuole contribuire alla soluzione è ben accetto

  10. #10
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    In realtà secondo me non è nemmeno difficile fare un ordinamento ricorsivo,basta mettere all' angolo l' elemento più piccolo e richiamare la funzione finchè non hai messo all' angolo tutti gli elementi,creando una specie di recursive sort,eccone una:
    codice:
    void *sort(int *pointer,int num)
    {
        int i;
        for(i=1;i<num;i++)
        {
            if(pointer[0]>pointer[i])
                swap(pointer,&pointer[i]);
        }
        if(i!=2)                                        // In questo caso sono rimasti solo due elementi,non si prosegue
            sort(&pointer[1],num-1);
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.