/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda C - Archivos - Ordenamiento

 
      Índice del Foro elrincondelc.com -> Algoritmos
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
juanjuanjuan



Registrado: 10 Feb 2014
Mensajes: 4

MensajePublicado: 10/02/2014 8:43 pm
Título: Ayuda C - Archivos - Ordenamiento

Buen dia a todos!
Estoy aprendiendo a programar en C y llegue a la parte de Archivos. Busque muchisimos tutoriales en google y en youtube pero no termino de entender como empezar los ejercicios. Supongo que dps de ayudarme a dar los primeros pasos lo voy a poder terminar solo..

En un archivo yo tengo millones de nombres de personas. Necesito guardar los 100 primeros nombres ordenados alfabeticamente en un vector.. el nombre del archivo llega a la funcion como parametro


Habia pensado guardar los primeros 100 de esos millones que me pasan y dps, si encuentra uno anterior, que saque el que estaba y ponga ese, pero no me los terminaria dando alfabeticamente y cre oque quedaria un quilombo... estoy bastante complicado porque no se como arrancar, si me pueden dar una mano se los agradezco muchisimo!

Gracias!
Juan
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 12/02/2014 1:53 am
Título:

Esta respuesta no te va a servir de mucho, porque se ve que ya has pensado las distintas estrategias:

A la que estás comentando, de incorporar los primeros 100 nombres y luego ir sustituyendo en esa lista de 100 por los nombres que cumplieran la condición, yo especificaría que siempre que añadieras un nombre, lo hicieras de forma ordenada. Así llegarías al vector de 100 nombres ordenados, y el mismo algoritmo que has usado para meter los primeros 100 nombres te serviría para ir sustituyendo los nuevos nombres en su sitio correcto, en caso de que su ordinal fuera anterior a los que tienes.

La otra opción es que ordenes el array de nombres entero, y luego selecciones los primeros 100 nombres.

No sé decirte cual es más costoso en términos de eficacia, pero los dos pasan a fin de cuentas por recorrer el array entero de nombres y hacer la ordenación.

Yo empezaría por definir un algoritmo que implementase la ordenación, y luego ya vería cómo o a qué aplicarlo.

Saludos
_________________
Aprendiendo
Volver arriba
juanjuanjuan



Registrado: 10 Feb 2014
Mensajes: 4

MensajePublicado: 12/02/2014 10:25 am
Título:

Gracias por responder!


Lo que yo pense es hacer esto:
Primero, ordeno alfabeticamente los primeros 100 nombres del archivo.
Despues, entro en el nombre 101, veo si es mayor que el 100. Si es mayor que el 100, dejo la lista como esta. Si es menor que el 100, veo el 99. Asi sucesivamente

Creo que esa es la solucion, pero no se como escribirlo...

Gracias!
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 12/02/2014 1:50 pm
Título:

Pues realmente, ahora que lo expresas así, veo que no hay diferencia entre ordenar los primeros 100 elementos y luego ir buscando los siguientes para meterlos en la lista de 100. Quiero decir que el mismo algoritmo será el usado desde el primer elemento hasta el último. Lo único, que en el vector sólo cabrán 100 elementos.

Si tienes que usar el vector, yo haría algo así:
Si es primer elemento->insertar elemento
Si no es primer elemento, hacer un recorrido de los elementos del vector hasta encontrar el primer mayor, e insertarlo antes de él
Si el nº de elementos del vector llega a 100, eliminar el último elemento una vez insertado el elemento.

Para hacer la comprobación, si usas elementos de tipo string, te ahorras ir comparando caracter a caracter, si no, pues como te decía, puedes empezar por implementar una función que retorne el mayor de las dos cadenas a comparar.
_________________
Aprendiendo
Volver arriba
juanjuanjuan



Registrado: 10 Feb 2014
Mensajes: 4

MensajePublicado: 12/02/2014 7:38 pm
Título:

Gracias por responder!

Si entendi bien lo que me decis, estaria recorriendo el vector mas de 1 vez. Solamente puede ser recorrido 1 vez.

Hago un ejemplo mas corto. Tengo 10 numeros y solamente tengo que imprimir los primeros 5:

Tengo: 3 4 7 2 1 5 6 8 9 0

Primero, guarda: 3 4 7 2 1
Ordena: 1 2 3 4 7
Agarra el 5. Lo mete en el lugar del 7
Agarra el 6. Lo deja afuera
Agarra el 8. Lo deja afuera
Agarra el 9. Lo deja afuera
Agarra el 0. Ve que es mas chico que el 5, asi que va al lado. Ve que es mas chico que el 4. Ve que es mas chico que el 3, 2 y 1. Lo pone ne e llugar del 1 y el 5 lo descarta

Queda: 0 1 2 3 4


Se entiende?

La forma de pensarla ya la tengo.. el problema esta en escribir el codigo.. realmente no se como hacerlo!

Muchas graciasssss
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 13/02/2014 2:29 am
Título:

Hola:

No me refería a eso exactamente.
Siguiendo tu ejemplo, yo haría esto:

Tengo: 3 4 7 2 1 5 6 8 9 0

Imagina un array de 5 elementos con todos los valores a -1

La idea es guardar los valores de forma ordenada, desde el primer momento:

3 4 7 2 1 5 6 8 9 0 --Lista origen

-1 -1 -1 -1 -1 --Lista destino
-----------------------------------
4 7 2 1 5 6 8 9 0 --Lista origen

3 -1 -1 -1 -1 --Lista destino
------------------------------------
7 2 1 5 6 8 9 0 --Lista origen

3 4 -1 -1 -1 --Lista destino
-------------------------------------
2 1 5 6 8 9 0 --Lista origen

3 4 7 -1 -1 --Lista destino
--------------------------------------
1 5 6 8 9 0 --Lista origen

2 3 4 7 0 --Lista destino
---------------------------------------
5 6 8 9 0 --Lista origen

1 2 3 4 7 --Lista destino
----------------------------------------
6 8 9 0 --Lista origen

1 2 3 4 5 --Lista destino
----------------------------------------
8 9 0 --Lista origen

1 2 3 4 5 --Lista destino
----------------------------------------
9 0 --Lista origen

1 2 3 4 5 --Lista destino
---------------------------------------
0 --Lista origen

1 2 3 4 5 --Lista destino
--------------------------------------
--Lista origen

0 1 2 3 4 --Lista destino
---------------------------------------

Vamos, que es lo mismo que tú dices, pero empezando la ordenación desde el principio, no cuando tenga rellenos los primero n integrantes de la lista ordenada a obtener

Si quieres ver métodos de ordenación, mira aqui: http://c.conclase.net/orden/
_________________
Aprendiendo
Volver arriba
juanjuanjuan



Registrado: 10 Feb 2014
Mensajes: 4

MensajePublicado: 13/02/2014 5:09 am
Título:

Esa parece una gran idea!

La parte que mas se me complica del ejercicio es reemplazar un nombre por otro en el array (supongo que se hace cambiando "donde apunta" el puntero..). Me podes dar una mano con eso?
Gracias!
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 13/02/2014 1:09 pm
Título:

Hola:

Pues te pongo el ejemplo del array de int del que hemos hablado:
Código:
#include <iostream>
using namespace std;

const int LISTA_CHICA=5;
const int LISTA_GRANDE=10;

void insertarOrdenado (int valor, int v[LISTA_CHICA], int contador);

int main()
{
    int lista[LISTA_GRANDE]= {3,4,7,2,1,5,6,8,9,0};
    int valores[LISTA_CHICA]= {3,5,8,5,4};
    int contador=0;
    for (int i=0; i<LISTA_GRANDE; i++)
        {
            insertarOrdenado (lista[i],valores, contador);
            if (contador<=LISTA_CHICA)
            {
                contador++;//esta variable la necesito para que no me recorrar todo el array hasta que no estén llenados los primeros LISTA_CHICA valores
            }
            for (int i=0; i<LISTA_CHICA; i++)
                {
                    cout<<valores[i]<<" - ";
                }
            cout<<endl;
        }

    return 0;
}

void insertarOrdenado(int valor, int v[LISTA_CHICA], int contador)
{
    cout<<"Insertando: "<<valor<<endl;
    int i=0;
    while (v[i]<valor && i<contador)
    {
        i++;
    }
    for (int j=LISTA_CHICA-1;j>i;j--)
    {
        v[j]=v[j-1];
    }
    v[i]=valor;
}


Algunas notas:
El hecho de iniciar el array de 5 elementos a 0 es para que no alberguen valores "raros", pero funcionará con cualquier valor previo que tenga.

La variable contador me sirve para que de primeras no me recorra todo el array, sino sólo hasta el máximo de valores que he insertado de la lista grande hasta el momento. Una vez he llegado a las primeras 5 inserciones (en éste caso), ya me interesa que recorra el array. Serguramente que haya mejores formas de hacerlo.

Y por último, éste algoritmo te puede servir si los nombres que tienes que comparar son string, ya que tiene sobrecargado el operador < y >.
Si no, tendrás que crear una función extra que te evalúe que cadena de char es menor, a la hora de insertarlas.

Espero que te sirva.
Saludos!
_________________
Aprendiendo
Volver arriba
      Índice del Foro elrincondelc.com -> Algoritmos
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com