Ordonamiento de Oyelami Este algoritmo de ordonamiento fue propuesta por el Dr. Moisés Olufemi Oyelami que - con modestia - llama Oyelami's Sort .
La idea es corregir el problema de "los Tortugas " del ordonamiento de burbuja. Dr. Olufemi Oyelami propone el uso de ordonamiento cocktail pero precediendo una fase inspirado en el método de ordonamiento de Batcher. Puede encontrar una descripción ( en Inglés ) aquí .
Este método reduce ligeramente el número de comparaciones realizadas.
Representación animada del ordenación de Oyelami :
Representación animada del ordenación de Oyelami PROCEDIMIENTO oyelami_sort ( VECTOR a[ 1 : n] )
dirección ← 'delantera', principio ← 1, fin ← n-1, actual ← 1
PARA i VARIANDO DE 1 HASTA n/2 HACER
SI a[i] > a|n-i] ENTONCES intercambiar a[i] y a[n-i]
FIN PARA
REPETIR
permut ← FALSO
REPETIR
SI a[actual] > a[actual + 1] ENTONCES
intercambiar a[actual] et a[actual + 1]
permut ← VERDADERO
FIN SI
SI (dirección='delantera') ENTONCES
actual ← actual + 1
SI NO
actual ← actual - 1
FIN SI
MIENTRAS QUE ( (dirección='delantera') Y (actual<fin)) O ( (dirección= 'trasera') Y (actual>principio))
SI (dirección='delantera') ENTONCES
dirección ← 'trasera'
fin ← fin - 1
SI NO
dirección ← 'delantera'
principio ← principio + 1
FIN SI
MIENTRAS QUE permut = VERDADERO
FIN PROCEDIMIENTO
let oyelami_sort vector =
let l
= ( Array . length vector
) - 1 in for i= 0 to ( l / 2 ) do
if vector. ( i) > vector. ( l - i) then
begin
let temp = vector. ( i) in
begin
vector. ( i) <- vector. ( l - i) ;
vector. ( l - i) <- temp;
end ;
end ;
done ;
let permut = ref true and actual = ref 0 and dirección = ref 1
and principio
= ref 0 and fin
= ref ( ( Array . length vector
) - 2 ) in while ( ! permut = true ) do
permut := false ;
while ( ( ! dirección= 1 ) && ( ! actual < ! fin) ) || ( ( ! dirección = - 1 ) && ( ! actual > ! principio) ) do
actual := ! actual + ! dirección;
if vector. ( ! actual) > vector. ( ! actual + 1 ) then
begin
(* Intercambiamos los dos elementos *)
permut := true ;
let temp = vector. ( ! actual) in
begin
vector. ( ! actual) <- vector. ( ! actual + 1 ) ;
vector. ( ! actual + 1 ) <- temp;
end
end
done ;
if ( ! dirección = 1 ) then fin := ! fin - 1 else principio := ! principio + 1 ;
dirección := - ! dirección;
done ;
vector;;
type tab = array [ 1 ..20 ] of integer ;
procedure oyelami_sort( var vector : tab) ;
var permut : boolean ;
actual, temp : integer ;
dirección : integer ;
principio, fin : integer ;
begin
for actual:= 1 to 10 do
begin
if vector[ actual] >vector[ 21 - actual] then
begin
temp:= vector[ actual] ;
vector[ actual] := vector[ 21 - actual] ;
vector[ 21 - actual] := temp;
end ;
end ;
actual:= 1 ;dirección:= 1 ;
principio:= 0 ;fin:= 20 ;
REPEAT
permut := false ;
while ( ( actual<fin) and ( dirección= 1 ) ) or
( ( dirección=- 1 ) and ( actual>principio) ) do
begin
actual:= actual+ dirección;
if vector[ actual] <vector[ actual- 1 ] then
begin
temp:= vector[ actual] ;
vector[ actual] := vector[ actual - 1 ] ;
vector[ actual - 1 ] := temp;
permut:= true ;
end ;
end ;
if dirección= 1 then fin:= fin - 1 else principio:= principio + 1 ;
dirección:=- dirección;
UNTIL ( not permut) ;
end ;
def oyelami_sort( vector) :
fin = len ( vector)
for i in range ( fin // 2 ) :
if vector[ i] > vector[ fin - i - 1 ] :
vector[ i] , vector[ fin - i - 1 ] = vector[ fin - i - 1 ] ,vector[ i]
permut,dirección,actual = True ,1 ,0
principio,fin = 0 ,len ( vector) -2
while permut == True :
permut = False
while ( actual< fin and dirección==1 ) or \
( actual> principio and dirección==-1 ) :
# prueba si intercambio
if vector[ actual] > vector[ actual + 1 ] :
permut = True
# Intercambiamos los dos elementos
vector[ actual] , vector[ actual + 1 ] = \
vector[ actual + 1 ] ,vector[ actual]
actual = actual + dirección
# Cambiamos el sentido
if dirección==1 :
fin = fin - 1
else :
principio = principio + 1
dirección = -dirección
return vector
typedef int bool;
enum { false , true } ;
void oyelami_sort( int * vector) {
bool permut;
int actual= 0 , dirección= 1 ;
int principio= 1 , fin= 19 ;
for ( actual= 0 ; actual<= fin/ 2 ; actual++ ) {
if ( vector[ actual] > vector[ fin - actual] ) {
int temp = vector[ actual] ;
vector[ actual] = vector[ fin - actual] ;
vector[ fin - actual] = temp;
}
}
actual= 0 ;
do {
permut= false ;
while ( ( ( dirección== 1 ) && ( actual< fin) ) || ( ( dirección==- 1 ) && ( actual> principio) ) ) {
actual += dirección;
if ( vector[ actual] < vector[ actual- 1 ] ) {
int temp = vector[ actual] ;
vector[ actual] = vector[ actual- 1 ] ;
vector[ actual- 1 ] = temp;
permut= true ;
}
}
if ( dirección== 1 ) fin--; else principio++;
dirección = - dirección;
} while ( permut) ;
}
Use este algoritmo para resolver el pequeño conjunto de la página anterior :
Comparaciones : Movimientos : Mezclar Resolver
Esta ordonamiento no es estable, como se puede comprobar aquí .
El rendimiento del ordonamiento de Oyelami es sin duda mejor que los de una ordonamiento de burbuja , e incluso como una de ordonamiento cocktail o ordonamiento Gnome pero siguen siendo muy inferiores a los de una Comb Sort ou e ordonamiento de Shell .
Usted lo puede verificar aquí .
El algoritmo Dr. Olufemi Oyelami por lo tanto no revolucionario. Esta es una pequeña mejora del ordonamiento de burbuja.