Lo siento pero no pude contestar antes porque no he estado con internet hasta ahora. Al final lo he conseguido asi:
Código PHP:
#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;
}
//---------------------------------------------------------------------------
Realmente no es algo estrictamente de eficiencia sino que estaba experimentando a ver si podia hacerlo o era muy complejo para mi y digamos que esta a medio camino jajaja.
Tengo algunas dudas:
1-Esta parte:
Código PHP:
//Las inicializo con los valores y direcciones iniciales
parray[0]=a;
parray[1]=b;
parray[2]=c;
parray[3]=d;
¿Hay alguna manera de inicializarlo usando un bucle de forma sencilla como hago por ejemplo con los contadores?
2-Misma duda pero con esta parte:
Código PHP:
size[0]=sizeof(a)/sizeof(int);
size[1]=sizeof(b)/sizeof(int);
size[2]=sizeof(c)/sizeof(int);
size[3]=sizeof(d)/sizeof(int);
La cosa es que si añado mas arrays se me puede olvidar inicializar uno de estos dos para ese array por eso pregunto si hay alguna manera de desentenderme de ello haciendo que se inicialicen todos en un bucle.
Si todos los arrays no fueran cada uno por su lado, fueran todos en un array de arrays y todos con el mismo tamaño no habria problema pero quiero saber como hacerlo en este caso en que cada array va por su lado y pueden tener tamaños diferentes.