elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C++] [Punteros] Ordenar array de enteros, pesadilla total.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C++] [Punteros] Ordenar array de enteros, pesadilla total.  (Leído 13,030 veces)
DarkItachi


Desconectado Desconectado

Mensajes: 516


Itachi Uchiha


Ver Perfil
[C++] [Punteros] Ordenar array de enteros, pesadilla total.
« en: 3 Mayo 2010, 21:15 pm »

Buenas, estoy intentando, mediante punteros, ordenar los enteros de un array por orden ascendente yendo simultáneamente por los dos extremos del array, algo así:

4 5 1 2 7 8 5 4 3 6

Comparo 4, 5 y 3 y 6.

4 5 1 2 7 8 5 4 3 6

Comparo 5,1 y 4,3

4 1 5 2 7 8 5 3 4 6

etc.

El caso esque creo que me estoy haciendo un lío enorme y creo no estar planteando bien el ejercicio, llevo hecho esto:

Código
  1. /* PROBLEMA ->
  2. Implementar en una función el siguiente algoritmo para ordenar un array de enteros.
  3. La idea es recorrer simultáneamente el array desde el principio y desde el final, comparando los elementos. Si los valores comparados no están en el orden adecuado, se intercambian y se vuelve a empezar el bucle. Si están bien ordenados, se compara el siguiente par.
  4. El proceso termina cuando los punteros se cruzan, ya que eso indica que hemos comparado la primera mitad con la segunda y todos los elementos estaban en el orden correcto.
  5. Usar una función con tres parámetros:
  6. void Ordenar(int* vector, int nElementos, bool ascendente);
  7. De nuevo, no se deben usar enteros, sólo punteros y aritmética de punteros. */
  8. #include <iostream>
  9. using namespace std;
  10. //Ej. 4 3 7 8 4 1 0 12 13 5
  11. void Ordenar(int*, int, bool);
  12. void leerarray(int*,int);
  13. int main()
  14. {
  15.    int array[]={4,3,7,8,4,1,0,12,13,5};
  16.    Ordenar(array,10,true);
  17.    leerarray(array,10);
  18.    cin.get(); cin.get();
  19. }
  20. void Ordenar(int *vector,int nElementos, bool ascendente)
  21. {
  22.    int *a, *b;
  23.    a=&vector[0]; b=&vector[nElementos-1];
  24.    while (*(a++) != *(b--))
  25.    {
  26.        int temp;
  27.        if (*(a-1)>*a) { temp=*(a-1); *(a-1)=*a; *a=temp; }
  28.        if (*(b+1)<*b) { temp=*(b+1); *(b+1)=*b; *b=temp; }
  29.    }
  30. }
  31.  

Alguna idea sobre donde estoy metiendo la pata? Porque de verdad, tantos asteriscos y demás me atormentan.

PD: Aún no he realizado lo de modo ascendente.

Salu2 y gracias =D


En línea

Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.
leogtz
. . .. ... ..... ........ ............. .....................
Colaborador
***
Desconectado Desconectado

Mensajes: 3.069


/^$/


Ver Perfil WWW
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #1 en: 3 Mayo 2010, 21:52 pm »

Edit.


« Última modificación: 3 Mayo 2010, 22:02 pm por Leo Gutiérrez. » En línea

Código
  1. (( 1 / 0 )) &> /dev/null || {
  2. echo -e "stderrrrrrrrrrrrrrrrrrr";
  3. }
  4.  
http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #2 en: 3 Mayo 2010, 22:02 pm »

No entiendo lo que haces, pero un error que canta a la vista es la condición del while, no estas mirando que se crucen los punteros, tienes que quitar para eso los asteriscos, o sea *(p++) != *(q--) por p++ != q--
Luego si pretendes ordenar, no sé, ordenar un vector requiere un análisis matemático para desarrollar un algoritmo nuevo. Simplemente lo digo porque ese método no funcionará, o imitas burbuja(requieres otro while anidado) o quicksort, no se que intentas, es parecido a ambos, pero no es ninguno. Ya de paso que sepas que casi fijo necesitarás 2 bucles anidados, porque toda ordenación genérica no puede bajar de O(nlog2n), o sea un bucle y algo más.
En línea

DarkItachi


Desconectado Desconectado

Mensajes: 516


Itachi Uchiha


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #3 en: 3 Mayo 2010, 22:12 pm »

No entiendo lo que haces, pero un error que canta a la vista es la condición del while, no estas mirando que se crucen los punteros, tienes que quitar para eso los asteriscos, o sea *(p++) != *(q--) por p++ != q--
Luego si pretendes ordenar, no sé, ordenar un vector requiere un análisis matemático para desarrollar un algoritmo nuevo. Simplemente lo digo porque ese método no funcionará, o imitas burbuja(requieres otro while anidado) o quicksort, no se que intentas, es parecido a ambos, pero no es ninguno. Ya de paso que sepas que casi fijo necesitarás 2 bucles anidados, porque toda ordenación genérica no puede bajar de O(nlog2n), o sea un bucle y algo más.

Bien, cambié lo que me dijistes, pero me peta en tiempo de ejecución, supongo que algun indice fuera de lugar, tenía pensado el método burbuja pero el enunciado dice simultáneamente desde los dos extremos, voy a mirar que puede ser y mañana os cuento. Salu2
En línea

Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #4 en: 3 Mayo 2010, 22:19 pm »

Claro que te peta, porque mientras uno decrementa otro incrementa, si el numero de elementos es par, ambos se "esquivan", y siguen creciendo to locos, disparados.
Ten en cuenta que un incremento + un decremento, es como avanzar de 2 en 2, a veces no se encontrarán.
edito: Antes no te lo dije porque no creí que pensaras que eso puede ordenar, necesitas otro bucle para hacer más pasadas, si pudieras ordenar ese vector aunque fuera de 5 elementos en una pasada, serías el nuevo Einstein  :laugh: eh! no digo que no lo seas, era sólo un chiste  ;).
« Última modificación: 3 Mayo 2010, 22:21 pm por biribau » En línea

.:BlackCoder:.


Desconectado Desconectado

Mensajes: 388


Cada dia C++!!


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #5 en: 4 Mayo 2010, 01:50 am »

Ese metodo de ordenacion sirve? 0o? no creo... Pero existen muchos... Esta el metodo por insercion, por seleccion (que es el que mas me gusta), burbuja, quicksort, etc... Mejor usa otro...
Saludos...
En línea

"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja



.:BlackCoder:.


Desconectado Desconectado

Mensajes: 388


Cada dia C++!!


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #6 en: 4 Mayo 2010, 04:12 am »

Ademas estas bastante errado con respecto a como entendiste el enunciado... tienes que recorrer el vector comparando el ultimo con el primero... luego el primero+1 con el ultimo-1... Y asi sucesivamente... No el primero con el primero +1 0o?  :-\ Y cuando dice que si se cumple la condicion se empieze de nuevo, no tiene sentido porq igual estarias comprando lo mismo... De nuevo...

Saludos...
En línea

"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja



DarkItachi


Desconectado Desconectado

Mensajes: 516


Itachi Uchiha


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #7 en: 4 Mayo 2010, 06:40 am »

Ademas estas bastante errado con respecto a como entendiste el enunciado... tienes que recorrer el vector comparando el ultimo con el primero... luego el primero+1 con el ultimo-1... Y asi sucesivamente... No el primero con el primero +1 0o?  :-\ Y cuando dice que si se cumple la condicion se empieze de nuevo, no tiene sentido porq igual estarias comprando lo mismo... De nuevo...

Saludos...

Bien, creo que ya lo pillé, esta tarde vuelvo a hacer el argoritmo de la forma que dices tu =D Ya os contaré :p

PD: Gracias
En línea

Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.
DarkItachi


Desconectado Desconectado

Mensajes: 516


Itachi Uchiha


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #8 en: 5 Mayo 2010, 07:21 am »

Voy de mal en peor :S

Código
  1. }
  2. void Ordenar(int *vector,int nElementos, bool ascendente)
  3. {
  4.    int *a, *b;
  5.    a=&vector[0]; b=&vector[nElementos-1];
  6.    for (int x=0;x<nElementos;x++)
  7.    {
  8.        for (int y=nElementos-1;y>0;y--)
  9.        {
  10.            int *temp;
  11.            if (*(a+x)>*(b-nElementos+y-1)) { temp=a+x; *(a+x)=*(b-nElementos+y-1); *(b-nElementos+y-1)=*temp; }
  12.            if (*(a+x)<*(b-nElementos+y-1)) { temp=b-nElementos+y-1; *(b-nElementos+y-1)=*(a+x); *(a+x)=*temp; }
  13.        }
  14.    }
  15. }
  16.  

Esto es lo que intenté hacer, pero sigo sin conseguirlo, :s, alguna idea?
En línea

Come to me when you have these eyes...

By more that you try it, a feather never will achieve to fly.
biribau

Desconectado Desconectado

Mensajes: 181


Ver Perfil
Re: [C++] [Punteros] Ordenar array de enteros, pesadilla total.
« Respuesta #9 en: 5 Mayo 2010, 17:56 pm »

Voy de mal en peor :S

Código
  1. }
  2. void Ordenar(int *vector,int nElementos, bool ascendente)
  3. {
  4.    int *a, *b;
  5.    a=&vector[0]; b=&vector[nElementos-1];
  6.    for (int x=0;x<nElementos;x++)
  7.    {
  8.        for (int y=nElementos-1;y>0;y--)
  9.        {
  10.            int *temp;
  11.            if (*(a+x)>*(b-nElementos+y-1)) { temp=a+x; *(a+x)=*(b-nElementos+y-1); *(b-nElementos+y-1)=*temp; }
  12.            if (*(a+x)<*(b-nElementos+y-1)) { temp=b-nElementos+y-1; *(b-nElementos+y-1)=*(a+x); *(a+x)=*temp; }
  13.        }
  14.    }
  15. }
  16.  

Esto es lo que intenté hacer, pero sigo sin conseguirlo, :s, alguna idea?
Es que no sé que intentas hacer...
2 consejos:
  • *(a+x) == a
  • (y se lee mejor)
  • el bucle del interior, y empieza en nElementos -1, pero tú usas -nElementos-1+y == y- nElementos - 1 == (nElementos-1)-nElementos-1 == 0 - 2, esto te cascará pues paras en y = 1 => b -nElementos == (vector+nElementos -1) -nElementos == vector-1(ilegal)
Hay 2 algoritmos parecidos de ordenación conocidos, mergesort y quicksort, ambos de tipo divide y vencerás.
Mergesort(es más parecido al tuyo) - ordena la mitad del vector y luego mezcla ambos vectores ordenados
Quicksort separa los mayores de un pivote de los menores en 2 particiones y ordena ambas mitades por el mismo método.
También tienes la burbuja que tenía una variante que sube y baja.
Yo no sé cómo se diseña un algoritmo de ordenación pero ya lo intenté alguna vez y no es sencillo, seguramente se necesite un desarrollo matemático, o al menos un pensamiento profundo. Si expones tu idea te podremos ayudar pero si estás codeando sin pensarlo es difícil que te salga(al menos has de contemplar todos los casos).
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 4,863 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Problema con array de punteros
Programación C/C++
NathanD 4 2,555 Último mensaje 26 Marzo 2013, 21:13 pm
por amchacon
eliminar datos duplicados array enteros
Java
javaman666 2 2,633 Último mensaje 9 Abril 2014, 12:28 pm
por Zoik
Ordenar alfabéticamente array de punteros a char (lenguaje C)
Programación C/C++
DanielPy 4 7,812 Último mensaje 7 Enero 2015, 18:42 pm
por rir3760
Ayuda para ordenar Array
.NET (C#, VB.NET, ASP)
bybaal 2 2,599 Último mensaje 15 Abril 2016, 12:37 pm
por bybaal
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines