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:
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:
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í:
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:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char v[5] = {'C', 'B', 'A', 'E', 'D'};
int ndx[5] = {0, 1, 2, 3, 4};
int i;
int j;
int aux;
/* Ordenacion de los indices mediante BubbleSort */
for (i = 4; i > 0; i--)
for (j = 0; j < i; j++)
if (v[ndx[j]] > v[ndx[j + 1]]){
aux = ndx[j];
ndx[j] = ndx[j + 1];
ndx[j + 1] = aux;
}
/* Valores segun su posicion */
for (i = 0; i < 5; i++)
/* Valores segun el orden indicado por el array de indices */
for (i = 0; i < 5; i++)
return EXIT_SUCCESS;
}
Un saludo