Algoritmo de Ordenación por Sacudida
Igual que en el caso de la burbuja, se puede aumentar la efectividad del método de la sacudida deteniendo la ordenación si se comprueba que en una pasada, tanto de izquierda a derecha como de derecha a izquierda, todos los elementos están ordenados. (Ver algoritmo de ordenación por sacudida con test).
El método de la sacudida se puede modificar para descartar más posiciones en los extremos, en lugar de una sola, como ocurre en los algoritmos anteriores. Si al realizar una pasada de derecha a izquierda el último intercambio afecta a las posiciones X y X+1, significa que los valores comprendidos entre las posiciones 1 y X ya están ordenados, por lo que no será necesario evaluar dichas posiciones en la siguiente pasada. Análogamente, si al realizar una pasada de izquierda a derecha el último intercambio afecta a las posiciones X-1 y X, significa que los valores comprendidos entre las posiciones X y N ya están ordenados, por lo que no será necesario evaluar dichas posiciones en la siguiente pasada. (Ver algoritmo de ordenación por sacudida con salto).
PSEUDOCÓDIGO
Ordenación sacudida
MÓDULO ordenacion_sacudida
DATOS
PARÁMETROS
Transforma V() de tipo T
Recibe N entera
VARIABLES
I, IZQ, DER enteras
AUX de tipo T
INICIO
IZQ ← 1
DER ← N
Mientras ( IZQ ≠ DER) hacer
** pasada de izquierda a derecha
Para I desde IZQ hasta DER-1
Si ( V(I) > V(I+1) ) entonces
AUX ← V(I)
V(I) ← V(I+1)
V(I+1) ← AUX
fin-si
fin-para
DER ← DER-1
Si ( IZQ ≠ DER ) entonces
** pasada de derecha a izquierda
Para I desde DER hasta IZQ+1 con incremento -1
Si ( V(I-1) > V(I) ) entonces
AUX ← V(I-1)
V(I-1) ← V(I)
V(I) ← AUX
fin-si
fin-para
IZQ ← IZQ+1
fin-si
fin-mientras
FIN
Ordenación por sacudida con test de comprobación
MÓDULO ordenacion_sacudida_test
DATOS
PARÁMETROS
Transforma V() de tipo T
Recibe N entera
VARIABLES
I, IZQ, DER, CEN enteras
SEGUIR lógica
INICIO
IZQ ← 1
DER ← N
SEGUIR ← VERDADERO
Mientras ( (IZQ ≠ DER) y (SEGUIR = VERDADERO) ) hacer
SEGUIR ← FALSO
Para I desde IZQ hasta DER-1
Si ( V(I) > V(I+1) ) entonces
AUX ← V(I)
V(I) ← V(I+1)
V(I+1) ← AUX
SEGUIR ← VERDADERO
fin-si
fin-para
DER ← DER-1
Si ( (IZQ ≠ DER) y (SEGUIR =VERDADERO) ) entonces
SEGUIR ← FALSO
Para I desde DER hasta IZQ+1 con incremento -1
Si ( V(I-1) > V(I) ) entonces
AUX ← V(I-1)
V(I-1) ← V(I)
V(I) ← AUX
SEGUIR ← VERDADERO
fin-si
fin-para
IZQ ← IZQ+1
fin-si
fin-mientras
FIN
Ordenación por sacudida con salto
MÓDULO ordenacion_sacudida_salto
DATOS
PARÁMETROS
Transforma V() de tipo T
Recibe N entera
VARIABLES
I, IZQ, DER, K enteras
AUX de tipo T
INICIO
IZQ ← 1
DER ← N
K ← 1
Mientras ( IZQ < DER ) hacer
Para I desde IZQ hasta DER-1
Si ( V(I) > V(I+1) ) entonces
AUX ← V(I)
V(I) ← V(I+1)
V(I+1) ← AUX
K ← I+1
fin-si
fin-para
DER ← K-1
Si ( IZQ < DER ) entonces
Para I desde DER hasta IZQ+1 con incremento -1
Si ( V(I-1) > V(I) ) entonces
AUX ← V(I-1)
V(I-1) ← V(I)
V(I) ← AUX
K ← I-1
fin-si
fin-para
IZQ ← K+1
fin-si
fin-mientras
FIN
CÓDIGO C
Ordenación sacudida
sacudida(int *v, int n)
{
int izq=0, der=0, i=0, aux=0;
izq=0;
der=n-1;
while (izq!=der){
for(i=izq;iv[i+1]){
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
}
}
der--;
if(izq!=der){
for(i=der;i>izq;i--){
if(v[i-1]>v[i]){
aux=v[i-1];
v[i-1]=v[i];
v[i]=aux;
}
}
izq++;
}
}
}
Ordenación por sacudida con salto
sacudida_test(int v[], int n){
int i, izq, der, cen, aux;
int seguir;
izq=0;
der=n-1;
seguir=1;
while((izq!=der) && (seguir==1)){
seguir=0;
for(i=izq;i v[i+1]){
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
seguir=1;
}
}
der--;
if ((izq!=der) && (seguir==1)){
seguir=0;
for(i=der;i>izq;i--){
if(v[i-1]>v[i]){
aux=v[i-1];
v[i-1]=v[i];
v[i]=aux;
seguir=1;
}
}
izq++;
}
}
}
Comentarios
Publicar un comentario