Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #7  
Antiguo 01-12-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 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
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
funciona bien en windows 7 64b pero en XP no funciona ASAPLTDA Varios 5 06-05-2011 16:24:50
funcion RANDOM ... funciona bien ?!!!!! ingel Varios 5 07-04-2010 15:22:08
No funciona bien el QrImage en el QReport AGAG4 Impresión 11 29-10-2008 16:16:56
QRImage no funciona bien eljinete Impresión 4 16-12-2005 01:02:05
La insercion de registros funciona pero..... ilichhernandez Conexión con bases de datos 1 22-10-2005 11:24:33


La franja horaria es GMT +2. Ahora son las 08:22:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi