edutecnica

Esercizio 10       

Eseguire il disordinamento di un vettore di interi ordinato tramite l'algoritmo di scambio.


Un metodo per mischiare le posizioni degli elementi di un array è definito come "algoritmo per una permutazione casuale di un insieme finito", ovvero un metodo per disordinare (mischiare) un insieme. Inizialmente ideato da Ronald Fisher e Frank Yates, è stato poi ottimizzato sia per le iterazioni necessarie a conseguire il risultato, sia per la capacità di operare in-place sull'insieme iniziale (cioè il risultato non opera il disordinamento creando una copia dell'insieme iniziale). Il principio è quello di pescare una posizione (escluso l'ultima) in modo casuale sull'array. Tale posizione viene scambiata con l'ultima, che si consolida e non partecipa più alla successiva iterazione. La posizione che precedeva l'ultima diventa la nuova ultima e il ciclo si ripete fino al consolidamento della posizione 2 dell'array (la prima lo diviene automaticamente), che determina la fine del disordinamento.

#include<iostream>
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<math.h>
using namespace std;

main(){
int i,rndpos,tmp;
int T[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int lg=sizeof(T)/sizeof(T[0]);
srand(time(0));
for( i= 0; i<lg; i++ ){
   // 0 <= rndpos <= k-1
   rndpos = floor(rand()%101 * i/100);
   // scambia T[i] con T[rndpos]
   tmp = T[i];
   T[i] = T[rndpos];
   T[rndpos] = tmp;
}//fine for
for( i=0; i<lg; i++ )cout<<" "<<T[i];
}//main