ordenag.cpp

// $Id$
/*
  COMIENZO DE DESCRIPCION

  Escribir una funci\'on {\tt void ordenag (list <int> &l, int m)} 
  que, dada una lista {\tt l}, va ordenando sus elementos de a grupos 
  de {\tt m} elementos. Por ejemplo si m=5, entonces {\tt ordenag} 
  ordena los primeros 5 elementos entre si, despues los siguientes 
  5 elementos, y asi siguiendo. Si la longitud {\tt n} de la lista 
  no es un m\'ultiplo de {\tt m}, entonces los \'ultimos 
  {\tt n mod m} elementos tambi\'en deben ser ordenados entre si. 
  Por ejemplo, si l = (10 1 15 7 2 19 15 16 11 15 9 13 3 7 6 12 1), 
  entonces despu\'es de {\tt ordenag (5)} debemos tener
  l = (1 2 7 10 15 11 15 15 16 19 3 6 7 9 13 1 12).  
  [Tomado en el examen final del 5-Dic-2002].  
  keywords: lista

  FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
#include <list>
#include <iostream>
#include "./util.h"
using namespace std;

// -----------------------------------------------------------------
void  ordenag (list<int> &L,int m) {
  list <int>::iterator p,q,z;
  int  k, x;
  p = L.begin();
  while (p != L.end()) {
    for (int k = m ; k > 0 ; k--) {
      // busca el menor elemento *z= min(*q) en el rango [p,p+k)
      q = p; 
      z = q;
      q++;
      for (int j = 1 ; j < k ; j++) {
	if (q == L.end()) break;
	if (*q < *z) z=q;
	q++;
      } // end j
      // lo inserta en L (p) y lo borra de R
      x =*z;
      if (z!=p) {
	L.erase(z);
	p=L.insert(p,x);
      } // end if
      p++;
      if (p == L.end()) break;
    } // end k
  } // end while
  p=L.begin();
  k=0;
  while (p!=L.end()) {
    cout << *p++ << " ";
    if (! (++k % m) ) cout << endl;
  } // enf while
  cout << endl;
} // end void

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



Generated by GNU Enscript 1.6.6.