PDA

View Full Version : [C]ordinamento per selezione ricorsivo non funzionante


toni00c
24-01-2011, 15:48
int b[SIZE] = { 20 , 5 , 3 ,4 , 10 , 2 } ;
int *primo = b ;
int *ultimo = &b[SIZE - 1 ] ;

seleziona ( b , primo , ultimo ) ;





void seleziona ( int a [] , int *i , int *n )

{
int small ;
int j ;
int temp ;


if ( *i < *n )
{
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

bobbytre
24-01-2011, 20:55
int b[SIZE] = { 20 , 5 , 3 ,4 , 10 , 2 } ;
int *primo = b ;
int *ultimo = &b[SIZE - 1 ] ;

seleziona ( b , primo , ultimo ) ;





void seleziona ( int a [] , int *i , int *n )

{
int small ;
int j ;
int temp ;


if ( *i < *n )
{
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

Non so se il tuo algoritmo di ordinamento sia stato pensato in modo ragionato e quindi funzionante

quello che salta pero' subito agli occhi in base al codice da ta postato

la condizione
if ( *i < *n )
del tuo esempio
risulta mai verificata ( *i = 20 e *n= 2 cioe 20<2 = FALSO ) quindi la funzione esce direttamente

pero' non credo che anche se entrasse venga effettuato quello che ti aspetti.

toni00c
24-01-2011, 21:36
Non so se il tuo algoritmo di ordinamento sia stato pensato in modo ragionato e quindi funzionante

quello che salta pero' subito agli occhi in base al codice da ta postato

la condizione
if ( *i < *n )
del tuo esempio
risulta mai verificata ( *i = 20 e *n= 2 cioe 20<2 = FALSO ) quindi la funzione esce direttamente

pero' non credo che anche se entrasse venga effettuato quello che ti aspetti.




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 ;

}




ciao
in effetti ho pasticciato un po ; non avendo idea da dove cominciare ho
creato una specie di bubble sort fac-simile , con parecchie sbavature

quello che ho postato sopra e il corretto codice della versione iterativa dell'argomento
vediamo se riusciamo a cavarne qualcosa

grazie

bobbytre
25-01-2011, 00:15
io non so di preciso cosa vuoi fare , ma se ti serve un algoritmo di ordinamento implementato in modo ricorsivo puoi utilizzare il quick sort.

toni00c
26-01-2011, 08:55
io non so di preciso cosa vuoi fare , ma se ti serve un algoritmo di ordinamento implementato in modo ricorsivo puoi utilizzare il quick sort.

il problema diceva di "trasformare" in Ricorsivo l'algoritmo di ordinamento per selezione ...
beh ci penserò ancora un po..
grazie!