Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: t4r0x en 11 Agosto 2013, 04:38 am



Título: Algoritmo de ordenamiento?
Publicado por: t4r0x en 11 Agosto 2013, 04:38 am
Hola, quiero saber si alguien sabe algun algoritmo de ordenacion que pueda restaurar
el orden original de una cadena, por ejemplo tengo esta cadena:
"EDWKLAAQDFF"
El algoritmo la ordenara asi:
"AADDEFFKLQW"

De forma alfabetica, y que despues pueda restaurar a como este estaba
El algoritmo de burbuja pueda que funcione pero no encuentro una forma para
mantener la forma original de la cadena , asi que me preguntaba si existen algortimos
que trabajen asi y como se llaman para poder buscar informacion y poder programar uno. gracias!


Título: Re: Algoritmo de ordenamiento?
Publicado por: za.asi en 11 Agosto 2013, 11:53 am
Podrias almacenar los canvios que hagas en el orden original en un vector para despues consultarlo y reordenar los caracteres


Título: Re: Algoritmo de ordenamiento?
Publicado por: eferion en 11 Agosto 2013, 13:11 pm
pues a ver... tienes qSort en la stl... algoritmo de burbuja, por selección, por inserción, por mezcla, por cuentas, mediante arbol binario...

Opciones hay muchas... para más detalles de cada una mira por internet... explicar todos y cada uno de ellos puede llevar bastante tiempo.



Título: Re: Algoritmo de ordenamiento?
Publicado por: Alien-Z en 11 Agosto 2013, 16:38 pm
Ten en cuenta que no todos los métodos que te ha comentado eferion sirven para lo mismo, es decir, ¿podrías usar cualquiera de esos algoritmos para ordenar tu cadena? SI; ¿Es igual de eficiente? NO, cada uno sirve para un caso distinto; deberías leer al menos una descripción para saber cuál utilizar en cada aplicación.


Título: Re: Algoritmo de ordenamiento?
Publicado por: t4r0x en 12 Agosto 2013, 03:11 am
Bueno si conozco los algoritmos basicos como el de burbuja , esos algoritmos estan
bien y ordenan como yo quiero pero mi problema principal es que quiero saber
una manera al menos un poco eficiente de saber como restaurar estas cadenas
a su forma original, y en realidad no se de que forma buscar en internet, por
algoritmos de ordenacion encuentro bastantes pero ninguno habla de restaurar
el estado original ese tipo de informacion necesito gracias


Título: Re: Algoritmo de ordenamiento?
Publicado por: crksergio en 12 Agosto 2013, 08:29 am
Si quieres volverlas a su forma original, por qué no guardar las ordenadas en un nuevo arreglo, así las originales quedan intactas?


Título: Re: Algoritmo de ordenamiento?
Publicado por: ivancea96 en 12 Agosto 2013, 15:25 pm
¿A qué te refieres con forma original? Un algoritmo de ordenamiento básico, como el "Burbuja", ordenaría eso eficientemente. Porque, te refieres a ordenar las letras de "mayor a menor" ¿no?


Título: Re: Algoritmo de ordenamiento?
Publicado por: rir3760 en 12 Agosto 2013, 17:17 pm
conozco los algoritmos basicos como el de burbuja , esos algoritmos estan bien y ordenan como yo quiero pero mi problema principal es que quiero saber una manera al menos un poco eficiente de saber como restaurar estas cadenas a su forma original
Lo primero que debes indicar es el lenguaje de programación que estas utilizando. Y, como ya te comentaron, los algoritmos de ordenacion solo hacen eso: ordenan.

Para realizar la operación que mencionas debes utilizar (en el caso de C) un array adicional. Este lo utilizas para almacenar los indices de (o también punteros a) cada uno de los elementos del array de valores.

Es el array de indices (o punteros) el que se ordena. Después si quieres acceder a los valores en orden accedes a ellos indirectamente mediante el array de soporte (indices o punteros).

Por ejemplo supongamos que el array de valores es:
Código:
V[0] == C
V[1] == B
V[2] == A
V[3] == E
V[4] == D

El array de indices lo inicializas con el indice del primer elemento, segundo, etc., de esta forma:
Código:
NDX[0] == 0
NDX[1] == 1
NDX[2] == 2
NDX[3] == 3
NDX[4] == 4

Y una vez ordenado el array de indices este termina así:
Código:
NDX[0] == 2
NDX[1] == 1
NDX[2] == 0
NDX[3] == 4
NDX[4] == 3
Indicando que, para imprimir en orden el array de valores, se deben imprimir los elementos con indices 2, 1, 0, 4 y 3. Un programa de ejemplo:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   char v[5]  = {'C', 'B', 'A', 'E', 'D'};
  7.   int ndx[5] = {0, 1, 2, 3, 4};
  8.   int i;
  9.   int j;
  10.   int aux;
  11.  
  12.   /* Ordenacion de los indices mediante BubbleSort */
  13.   for (i = 4; i > 0; i--)
  14.      for (j = 0; j < i; j++)
  15.         if (v[ndx[j]] > v[ndx[j + 1]]){
  16.            aux = ndx[j];
  17.            ndx[j] = ndx[j + 1];
  18.            ndx[j + 1] = aux;
  19.         }
  20.  
  21.   /* Valores segun su posicion */
  22.   for (i = 0; i < 5; i++)
  23.      printf("%3c", v[i]);
  24.   putchar('\n');
  25.  
  26.   /* Valores segun el orden indicado por el array de indices */
  27.   for (i = 0; i < 5; i++)
  28.      printf("%3c", v[ndx[i]]);
  29.   putchar('\n');
  30.  
  31.   return EXIT_SUCCESS;
  32. }

Un saludo


Título: Re: Algoritmo de ordenamiento?
Publicado por: eferion en 12 Agosto 2013, 22:46 pm
Bueno si conozco los algoritmos basicos como el de burbuja , esos algoritmos estan
bien y ordenan como yo quiero pero mi problema principal es que quiero saber
una manera al menos un poco eficiente de saber como restaurar estas cadenas
a su forma original, y en realidad no se de que forma buscar en internet, por
algoritmos de ordenacion encuentro bastantes pero ninguno habla de restaurar
el estado original ese tipo de informacion necesito gracias


A no ser que guardes el original o mapees los resultados ( es decir, que guardes la posición que tenía cada cadena en su posición original ) te va a ser imposible restaurar la información.

Tu imagínate que tiras 6 dados... después los ordenas de menor a mayor... se te ocurre alguna forma humanamente posible de, viendo la secuencia ordenada, deducir la posición original de cada uno ?? no, verdad ?? pues eso.