Ciao...questo è un codice tradotto da me (barbaramente) per fare le permutazioni di numeri( che potresti usare come etichette...). La funzione usa come inputs puntatori questo perchè lo usi all'interno di un altro programma statistico. Tu puoi aggiustare il tutto alle tue esigenze se non ti piace la versione con argomenti "puntatori"...
Ecco il codice
void permute(double *vec, int *n, int *p, int *ip, int *seqn, int *d, int *m, double *res)
{
/*
vec=vettore da permutare. In testa al vettore metti uno 0
n=lunghezza del vettore (senza contare lo 0)
p=concatena n+1,1:n,n+1 (metti questa sequenza di numeri in un unico vettore). In testa al vettore metti uno 0
ip e seqn= vettore (di dimensione n+1) di interi da 1 a n. In testa al vettore metti lo 0
d=vettore (dimensione n+1) in cui al primo posto metti 0 e i restanti elementi uguali a -1. Anche in questo vettore metti in testa uno 0
m=n+1
res=risultato(lunghezza n*n!). Troverai tutte le permutazioni del vettore (da 1 a n la prima permutazione, da n+1 a 2n la seconda permutazione e così via)
Per esempio se vec[3]={1,2} allora
- n=2
- p[5]={0,3,1,2,3}
- ip[3]={0,1,2}
- d[3]={0,0,-1}
- m=3
-
*/
int i, ite=0, index0[*n+1], chk[*n+1], count=0, index1, index2, tmp, index20, index30[*n+1], j=1;
do{
for(i=1 ; i<=*n ; i++)
{
res[ite**n+i-1] = vec[p[i+1]];
index0[i] = ip[i]+d[i]+1;
}
ite += 1;
*m = *n;
for(i=1 ; i<=*n ; i++)
{
if( p[index0[i]]>seqn[i] ){ chk[i] = 0; }else{ chk[i] = 1; count +=1;}
}
double *p_max, ini_p_max[count+1];
for(i=1 ; i<=*n ; i++){ if( chk[i]==1 ) {ini_p_max[j] = (double) seqn[i]; j+=1;} }
j=1;
p_max=&ini_p_max[1];
int *dim, ini_dim;
dim=&ini_dim;
*dim=count;
count=0;
sort1(p_max, dim);
*m= (int) p_max[0];
if(*m<*n)
{
for( i=1 ; i<=(*n-*m) ; i++ ) d[*m+i]= -d[*m+i];
}
index1 = ip[*m]+1;
index2 = p[index1 + d[*m]];
p[index1] = p[index1 + d[*m]];
p[index1 + d[*m]] = *m;
tmp = ip[index2];
ip[index2] = ip[*m];
ip[*m] = tmp;
}while(*m!=1);
}
poi aggiustalo alle tue esigenze (un passo da poco, penso). buon lavoro