P. 1
Manual de analisis y deseño de algoritmos

Manual de analisis y deseño de algoritmos

|Views: 1.418|Likes:
Publicado porSttug

More info:

Published by: Sttug on May 15, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/05/2013

pdf

text

original

Denominado así por su desarrollador Donald Shell (1959). El ordenamiento
por incrementos decrecientes (o método shellsort) es una generalización
del ordenamiento por inserción donde se gana rápidez al permitir
intercambios entre elementos que se encuentran muy alejados.

La idea es reorganizar la secuencia de datos para que cumpla con la
propiedad siguiente: si se toman todos los elementos separados a una
distancia h, se obtiene una secuencia ordenada.

Se dice que la secuencia h ordenada está constituida por h secuencias
ordenadas independendientes, pero entrelazadas entre sí. Se utiliza una
serie decreciente h que termine en 1.

for ( h = 1; h <= n/9; h = 3*h + 1 );
for ( ; h > 0; h/= 3 )
for ( i = h + 1; i <= n; i+= 1 )
{ v = A[i];
j = i;

Página 75

while ( j > h && A[j-h] > v ) then
{ A[j] = A[j-1];
j -= h;

}
A[j] = v;

}

Análisis del algoritmo:

Esta sucesión de incrementos es fácil de utilizar y conduce a una ordenación
eficaz. Hay otras muchas sucesiones que conducen a ordenaciones mejores.
Es difícil mejorar el programa anterior en más de un 20%, incluso para n
grande. Existen sucesiones desfavorables como por ejemplo: 64, 32, 16, 8, 4,
2, 1, donde sólo se comparan elementos en posiciones impares cuando h=1.

Nadie ha sido capaz de analizar el algoritmo, por lo que es difícil evaluar
analíticamente los diferentes incrementos y su comparación con otros
métodos, en consecuencia no se conoce su forma funcional del tiempo de
ejecución.

Para la sucesión de incrementos anterior se tiene un T(n) = n( log n)2 y n1,25.
La ordenación de Shell nunca hace más de n3/2 comparaciones (para los
incrementos 1,2,13, 40.....) .

6.7.2 Ordenamiento por Mezclas Sucesivas (merge sort)

Se aplica la técnica divide-y-vencerás, dividiendo la secuencia de datos en dos
subsecuencias hasta que las subsecuencias tengan un único elemento, luego
se ordenan mezclando dos subsecuencias ordenadas en una secuencia
ordenada, en forma sucesiva hasta obtener una secuencia única ya ordenada.
Si n = 1 solo hay un elemento por ordenar, sino se hace una ordenación de
mezcla de la primera mitad del arreglo con la segunda mitad. Las dos mitades
se ordenan de igual forma.

Ejemplo: Se tiene un arreglo de 8 elementos, se ordenan los 4 elementos de
cada arreglo y luego se mezclan. El arreglo de 4 elementos, se ordenan los 2
elementos de cada arreglo y luego se mezclan. El arreglo de 2 elementos,
como cada arreglo sólo tiene n = 1 elemento, solo se mezclan.

Página 76

void ordenarMezcla(TipoEle A[], int izq, int der)
{ if ( izq < der )
{ centro = ( izq + der ) % 2;
ordenarMezcla( A, izq, centro );
ordenarMezcla( A, centro+1, der);
intercalar( A, izq, centro, der );

}

}
void intercalar(TipoEle A[], int a, int c, int b )
{ k = 0;
i = a;
j = c + 1;
n = b - a;
while ( i < c + 1 ) && ( j < b + 1 )
{ if ( A[i] < A[j] )
{ B[k] = A[i];
i = i + 1;

}

else

{ B[k] = A[j];
j = j + 1;

}
k = k + 1;

};
while ( i < c + 1 )
{ B[k] = A[i];
i++;
k++;

};
while ( j < b + 1 )

Página 77

{ B[k] = A[j];
j++;
k++;

};
i = a;
for ( k = 0; k < n; i++ )
{ A[i] = B[k];
i++;

};

};

Análisis del algoritmo:

La relación de recurrencia del algoritmo es T(1) = 1, T(n) = 2 T(n/2) + n, cuya
solución es T(n) = n log n.

Página 78

Capítulo 7

Algoritmos de Búsqueda

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->