ralea.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

  Usando las operaciones del TAD lista, escribir una funci\'on 
  {\tt void random_shuffle (list <int> &L)} que, dada una lista 
  de enteros {\tt L}, reordena sus elementos en forma aleatoria.  
  Se sugiere el siguiente algoritmo: usando una lista auxiliar 
  {\tt Q} se van generando n\'umeros enteros desde 0 a 
  {\tt length (L) - 1}. Se extrae el elemento j-\'esimo de
  {\tt l} y se inserta en {\tt Q}. Finalmente, se vuelven a 
  pasar todos los elementos de la cola {\tt Q} a la lista {\tt L}. 
  [Ejercicio tomado en el Ex\'amen Final del 05/07/01]
  keywords: lista
  
  FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
#include <list>
#include <iostream>
#include <cassert>
#include <map>
#include "./util.h"
using namespace std;

// -----------------------------------------------------------------
void random_shuffle(list<int> &L) {
  list<int>::iterator p,z; 
  list<int> q;
  int k,n;
  // Cuenta el numero de elementos en la lista L
  n=0;
  p=L.begin();
  while (p++!=L.end()) n++;
  // En cada iteracion del lazo se saca un elemento
  // al azar de la lista L y se lo inserta en la cola Q
  for (int h=n;h>0;h--) {
    // A esta altura la lista L tiene m elementos
    // asi que generamos un entero entre 0 y m-1
    k=irand(h);
    // nos posicionamos en el elemento k en la lista L
    p=L.begin();
    for (int j=0;j<h-1;j++) p++;
    // inserta el elemento k de la lista L al final de la cola Q
    // y lo elimina de la lista L
    q.insert(q.end(),*p);
    L.erase(p);
  } // end h
  // Vuelve a copiar todos los elementos de la cola a la lista
  z=q.begin();
  while (z!=q.end()) {
    L.insert(L.end(),*z);
    z=q.erase(z);
  } // end while
} 

// -----------------------------------------------------------------
int main() {
  list<int> L;
  int n=3;
  int m=10;
  for (int i=0;i<n;i++) {
    L.clear();
    randl(L,m,10.0);
    cout << endl;
    cout << "Antes de random_shuffle  : ";
    printl(L);
    random_shuffle (L);
    cout << endl;
    cout << "Despues de random_shuffle: ";
    printl(L);
  } // end i
  cout << endl;
  return 0;
}
// -----------------------------------------------------------------


Generated by GNU Enscript 1.6.6.