Práctica: Cálculo de la Mediana

Escriba un módulo que provea una función para el cálculo de la mediana de una lista. La mediana es el número tal que la mitad de los elementos de la lista son menores y la otra mitad mayores. Para ello complete las partes que faltan del siguiente código XS:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"


MODULE = Algorithm::MedianSelect::XS		PACKAGE = Algorithm::MedianSelect::XS		

void
median(...)
    PROTOTYPE: @
    INIT:
        long buffer, numbers[items];
        int i, is_sorted, median;
    PPCODE:
        if (items <= 1) {
	    croak("Require more than one argument");
	}
        for (i = 0; i < items; i++) {
	    numbers[i] = ____(__(i)); # tomar el i-ésimo argumento
	}
	do {
	    is_sorted = 1;
	    for (i = 0; i < (items-1); i++) {
	        if (numbers[i-1] < numbers[i] && numbers[i] < numbers[i+1]) 
		    continue;
	        if (numbers[i] > numbers[i+1]) {
	            buffer = numbers[i];
		    numbers[i] = numbers[i+1];
		    numbers[i+1] = buffer;
		    is_sorted = 0;
	        }
	    }
	} while (!is_sorted);
	if (items % 2 == 0) median = items / 2;
	else median = (items - 1) / 2;
	______(__,1); # Hacer espacio en la pila
	_____(__________(newSViv(numbers[median]))); # Empujar valor de retorno

Casiano Rodríguez León
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19