Ver Mensaje Individual
  #7  
Antiguo 01-12-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Reputación: 14
aguml Va por buen camino
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 valorint array[], int nElementos);
int insertarElemento(int valorint array[], int nElementosint pos);
int obtenerIndice(int indexint valIniint valFin);

int main(int argccharargv[])
{
    
//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=0i<NARRAYSsizeTotal += size[i++]);

    
//Inicializo los contadores
    
for(i=0i<NARRAYScontador[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 valorint 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 valorint array[], int nElementosint 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=nElementosposi--) {
        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 indexint valIniint 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.

Última edición por aguml fecha: 01-12-2016 a las 13:36:29.
Responder Con Cita