sábado, 22 de septiembre de 2012

Mi implementación del mergesort

Bueno, como parte de una tarea de análisis y diseño de algoritmos, tuve que implementar el método mergesort para el ordenamiento de vectores de enteros. Como saben este algoritmo consiste en dividir el arreglo original en arreglos más pequeños, de hecho hasta arreglos de un solo elemento, una vez separados los arreglos, se ordenan a partir de la mezcla de todos ellos. Una vez terminada mi implementación en C de este curiosos método de ordenamiento, les comparto cómo quedo, espero que les sirva, saludos desde México !

PD ya saben cualquier duda de la implementación, estoy a sus ordenes en p.camarillor@gmail.com o en @p_camarillor o en www.facebook.com/p.camarillor


int * Mergesort(int *v, int longitud)
{
int mitad = longitud / 2;
int residuo = longitud % 2;
int *vectorIzquierdo, *vectorDerecho;
int i = 0;

//Caso base, la lista es de un elemento y se considera ordenado
if(longitud == 1)
{
return v;
}

vectorIzquierdo = (int *)malloc((mitad)*sizeof(int));
vectorDerecho = (int *)malloc((mitad  + residuo)*sizeof(int));

//Para cada entero en el vector v antes de la mitad, se agrega a la izquierda
for(i = 0; i < mitad; i++)
{
*(vectorIzquierdo + i) = v[i];

}
//Para cada entero en el vector v despues de la mitad, se agrega a la derecha
int j = 0;
for(i = mitad; i < longitud; i++)
{
*(vectorDerecho + j) = v[i];
j++;
}

//Se llama recursivamente hasta obtener un vector de un elemento
vectorIzquierdo = Mergesort(vectorIzquierdo, mitad);
vectorDerecho = Mergesort(vectorDerecho, (mitad + residuo));

return merge(vectorIzquierdo, mitad, vectorDerecho, (mitad + residuo));
}

int * merge(int *vI, int longitudVectorIzquierdo, int * vD, int longitudVectorDerecho)
{
int *lstResultado;
int cabezaLista = 0;
lstResultado = (int *)malloc((longitudVectorIzquierdo + longitudVectorDerecho)*sizeof(int));
while(longitudVectorIzquierdo > 0 || longitudVectorDerecho > 0)
{
if(longitudVectorIzquierdo > 0 && longitudVectorDerecho > 0)
{
if(*(vI + 0)  <= *(vD + 0))
{
*(lstResultado + cabezaLista) = *(vI + 0);
//Se elimina el elemento que se ha ingresado en la lista final
vI++; //Se incrementa la posición del apuntador
longitudVectorIzquierdo--;//Se resta el número de elementos
cabezaLista++;
}
    else
{
*(lstResultado + cabezaLista) = *(vD + 0);
//Se elimina el elemento que se ha ingresado en la lista final
vD++; 
longitudVectorDerecho--;
cabezaLista++;
}
}
else if(longitudVectorIzquierdo > 0)
{
*(lstResultado + cabezaLista) = *(vI + 0);
//Se elimina el elemento que se ha ingresado en la lista final
vI++; 
longitudVectorIzquierdo--;
cabezaLista++;
}
       else if(longitudVectorDerecho > 0)
{
*(lstResultado + cabezaLista) = *(vD + 0);
//Se elimina el elemento que se ha ingresado en la lista final
vD++;
longitudVectorDerecho--;
cabezaLista++;
}

}
return lstResultado;
}

sábado, 14 de abril de 2012

Subir Archivos Php sobre IIS en windows server 2008 R2

En pasados días tuve la necesidad de desarrollar una aplicación en php, pero el sevidor web era el IIS que Windows Server 2008 R2 trae instalado. Mi aplicación tenía que ser capaz de subir cierta imagen al servidor y almacenarla. El problema vino cuando mi script en php lanzaba el siguiente error:
failed to open stream: Permission denied
Esto se debe a que el usuario invitado (User guest) a nuestro IIS no tiene los permisos necesarios para escribir en nuestro servidor. Estos permisos son necesarios para realizar la famosa función copy de php para cargar archivos. 


La solución es muy simple y a la vez un poco peligrosa. Consiste en otorgarle a la carpeta root de nuestro IIS los permisos para modificar y escribir información al usuario invitado. Para esto hay que realizar los siguientes pasos:
  1. Dar click derecho en el nombre de la carpeta .../inetpub y seleccionar la opción Propiedades
  2. Después seleccionar el tab de Seguridad.
  3. Dar click en el boton "Editar" y agregar (si no existe aún) el usuario IUSR.
  4. Ororgarle a ese nuevo usuario los permisos de escritura y modificación y Listo !!
Ahora la función copy no deberá lanzar ningún error y deberá escribir correctamente en el servidor las imagenes desde el script de pgp