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;iv[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