#include <stdio.h>
#include <stdlib.h>
#define NARRAYS 4
int buscarPos(int valor, int array[], int nElementos);
int insertarElemento(int valor, int array[], int nElementos, int pos);
int obtenerIndice(int index, int valIni, int valFin);
int main(int argc, char* argv[])
{
//Esta es usada como contador para los bucles FOR
int i;
//Estas son los arrays que queremos pasar ordenados a un solo array
//Tiene que ser intercalandolos, o sea primero uno del a, luego uno del b,
//luego otro del c...
int a[]={50,2,11,55,3,1,7,9};
int b[]={4,2,6,10,8};
int c[]={9,8,7,15};
int d[]={56,44,22,33,88,66,77,99};
//Puntero para el array dinamico que contendrá todos los elementos ordenados
int *ordenados;
//Usada para guardar en el la posicion en la que hay que insertar el elemento
int pos;
//Contador del numero de elementos insertados
int nElements=0;
//Esta variable es necesaria para saber a que array le tocará insertar
int balanceo=0;
//Arrays usados para almacenar los valores o punteros a las variables
//necesarias para el balanceo entre los arrays
int contador[NARRAYS],*parray[NARRAYS],size[NARRAYS],sizeTotal=0;
//Las inicializo con los valores y direcciones iniciales
parray[0]=a;
parray[1]=b;
parray[2]=c;
parray[3]=d;
size[0]=sizeof(a)/sizeof(int);
size[1]=sizeof(b)/sizeof(int);
size[2]=sizeof(c)/sizeof(int);
size[3]=sizeof(d)/sizeof(int);
//Obtengo el total de elementos que debe contener el array dinamico
for(i=0; i<NARRAYS; sizeTotal += size[i++]);
//Inicializo los contadores
for(i=0; i<NARRAYS; contador[i++]=0);
//Solicito la memoria necesaria para colocar la lista combinada ordenada
ordenados = calloc(sizeTotal ,sizeof(int));
while(nElements < sizeTotal){
if(contador[balanceo] < size[balanceo]){
//Obtengo la posicion que tomará dicho elemento en la lista en orden ascendente
pos = buscarPos(parray[balanceo][contador[balanceo]],ordenados,nElements);
//Inserto el elemento en dicha posicion
nElements = insertarElemento(parray[balanceo][contador[balanceo]],ordenados,nElements,pos);
contador[balanceo]++;
}
balanceo=obtenerIndice(balanceo,0,3);
}
for(pos=0;pos<nElements;pos++)
printf("%i\n",ordenados[pos]);
free(ordenados);
getchar();
return 0;
}
//---------------------------------------------------------------------------
int buscarPos(int valor, int array[], int nElementos)
{
//Esta la uso como indice para posicionarme en el elemento del array
//Empiezo comparando con el ultimo elemento por lo que lo inicializo para ello
int pos=nElementos-1;
int aux_pos; //La uso para saber si al dividir me da el mismo indice
int pos_ini=0; //Contendra el indice inicial desde el que buscar
int pos_fin=pos; //Contendra el indice final hasta donde buscar
//En este condicional solo entro si el numero de elementos es mayor que 0
//ya que si vale 0 solo tengo que colocarlo en la primera posicion
if(nElementos > 0)
{
do{
aux_pos=pos;
if(valor > array[pos]){
//Si entro aqui quiere decir que todos los elementos del array
//hasta la posicion indicada en el indice son menores con lo que
//la posicion inicial pasa a ser la posicion indicada por pos
pos_ini = pos;
//Obtengo el indice del centro entre la posicion inicial y la final
pos = pos_ini + (pos_fin - pos_ini) / 2;
//Si el valor es mayor que el de la posicion del array y se
//cumple el siguiente condicional hay que incrementar en 1 la
//posicion ya que solo hay que pasar esa posicion para que quede
//en el sitio correcto
if(aux_pos == pos){
pos++;
break;
}
}else if(valor < array[pos]){
//Si entro aqui es porque todos los elementos del array desde la
//posicion indicada hasta el final del array son mayores que el
//valor buscado con lo que la posicion final pasa a ser la
//posicion indicada por pos
pos_fin = pos;
//Obtengo el indice del centro entre la posicion inicial y la final
pos = pos_ini + (pos_fin - pos_ini) / 2;
}
}while(aux_pos != pos);
}else{
pos=0;
}
return pos;
}
//---------------------------------------------------------------------------
int insertarElemento(int valor, int array[], int nElementos, int pos)
{
int i;
//Si hay que intercalar un elemento desplazo todos los que esten a partir de
//esa posicion hacia el siguiente elemento a la derecha
for (i=nElementos; i > pos; i--) {
array[i]=array[i-1];
}
//Coloco el elemento en el lugar que le corresponde
array[pos]=valor;
nElementos++;
return nElementos;
}
//---------------------------------------------------------------------------
//Obtengo el indice usando el balanceo deseado en este caso
int obtenerIndice(int index, int valIni, int valFin)
{
index++;
if(index > valFin)
index=valIni;
return index;
}
//---------------------------------------------------------------------------