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)
{
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