Autor
|
Tema: [C++] [Punteros] Ordenar array de enteros, pesadilla total. (Leído 13,030 veces)
|
DarkItachi
Desconectado
Mensajes: 516
Itachi Uchiha
|
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: /* PROBLEMA -> Implementar en una función el siguiente algoritmo para ordenar un array de enteros. 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. 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. Usar una función con tres parámetros: void Ordenar(int* vector, int nElementos, bool ascendente); De nuevo, no se deben usar enteros, sólo punteros y aritmética de punteros. */ #include <iostream> using namespace std; //Ej. 4 3 7 8 4 1 0 12 13 5 void Ordenar(int*, int, bool); void leerarray(int*,int); int main() { int array[]={4,3,7,8,4,1,0,12,13,5}; Ordenar(array,10,true); leerarray(array,10); cin.get(); cin.get(); } void Ordenar(int *vector,int nElementos, bool ascendente) { int *a, *b; a=&vector[0]; b=&vector[nElementos-1]; while (*(a++) != *(b--)) { int temp; if (*(a-1)>*a) { temp=*(a-1); *(a-1)=*a; *a=temp; } if (*(b+1)<*b) { temp=*(b+1); *(b+1)=*b; *b=temp; } } }
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
Mensajes: 3.069
/^$/
|
Edit.
|
|
« Última modificación: 3 Mayo 2010, 22:02 pm por Leo Gutiérrez. »
|
En línea
|
|
|
|
biribau
Desconectado
Mensajes: 181
|
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
Mensajes: 516
Itachi Uchiha
|
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
Mensajes: 181
|
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 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
Mensajes: 388
Cada dia C++!!
|
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
Mensajes: 388
Cada dia C++!!
|
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
Mensajes: 516
Itachi Uchiha
|
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
Mensajes: 516
Itachi Uchiha
|
Voy de mal en peor :S } void Ordenar(int *vector,int nElementos, bool ascendente) { int *a, *b; a=&vector[0]; b=&vector[nElementos-1]; for (int x=0;x<nElementos;x++) { for (int y=nElementos-1;y>0;y--) { int *temp; if (*(a+x)>*(b-nElementos+y-1)) { temp=a+x; *(a+x)=*(b-nElementos+y-1); *(b-nElementos+y-1)=*temp; } if (*(a+x)<*(b-nElementos+y-1)) { temp=b-nElementos+y-1; *(b-nElementos+y-1)=*(a+x); *(a+x)=*temp; } } } }
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
Mensajes: 181
|
Voy de mal en peor :S } void Ordenar(int *vector,int nElementos, bool ascendente) { int *a, *b; a=&vector[0]; b=&vector[nElementos-1]; for (int x=0;x<nElementos;x++) { for (int y=nElementos-1;y>0;y--) { int *temp; if (*(a+x)>*(b-nElementos+y-1)) { temp=a+x; *(a+x)=*(b-nElementos+y-1); *(b-nElementos+y-1)=*temp; } if (*(a+x)<*(b-nElementos+y-1)) { temp=b-nElementos+y-1; *(b-nElementos+y-1)=*(a+x); *(a+x)=*temp; } } } }
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Duda Punteros Dobles/Array de punteros
Programación C/C++
|
MisterJava
|
2
|
4,863
|
30 Diciembre 2012, 20:19 pm
por MisterJava
|
|
|
Problema con array de punteros
Programación C/C++
|
NathanD
|
4
|
2,555
|
26 Marzo 2013, 21:13 pm
por amchacon
|
|
|
eliminar datos duplicados array enteros
Java
|
javaman666
|
2
|
2,633
|
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
|
7 Enero 2015, 18:42 pm
por rir3760
|
|
|
Ayuda para ordenar Array
.NET (C#, VB.NET, ASP)
|
bybaal
|
2
|
2,599
|
15 Abril 2016, 12:37 pm
por bybaal
|
|