Algoritmo de Ordenación por Sacudida

Este método, también conocido como método de ordenación por vibración, es una mejora del método de la burbuja, que mezcla sus dos versiones alternativamente, realizando una pasada de izquierda a derecha y a continuación otra de derecha a izquierda, recortándose los elementos a tratar por ambos extremos del vector.
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++;
	}
	}
}

Volver al índice

Volver a Búsqueda y Ordenación Interna



Comentarios

Entradas populares de este blog

Algoritmo de ordenación por mezcla natural

Algoritmo de ordenación por mezcla directa

Algoritmo de Ordenación por Intercambio Directo (Burbuja)