.
Mostrando entradas con la etiqueta Ordenamiento. Mostrar todas las entradas
Mostrando entradas con la etiqueta Ordenamiento. Mostrar todas las entradas

08 junio, 2011

Ordenamiento Shell (codigo)

En el método se propone que las comparaciones se efectúen con saltos de mayor tamaño, pero con incrementos que sean saltos de mayor tamaño pero con incrementos decrecientes, así los elementos quedarán ordenados en el arreglo.

Pseudocódigo

INT, I y AUX son variables de tipo entero. BAND es una variable de tipo booleano)
1.- Hacer INT ? N +1.
2.- Mientras (INT > 1) Repetir
Hacer INT ? parte entera (INT /2) y BAND? VERDADERO.
2.1.- Mientras (BAND == VERDADERO) Repetir.
Hacer BAND ? FALSO e I ? 1.
2.1.1.- Mientras ((I + INT) <= N) Repetir.
2.1.1.1.- Si A [I] > A[I + INT] Entonces.
Hacer AUX ? A[I], A[I] ? A[I + INT], A[I + INT] ? AUX y
BAND ? VERDADERO.
2.1.1.2.- {Fin del condicional del paso 2.1.1.1}
Hacer I ? I + 1.
2.1.2.- {Fin del ciclo del paso 2.1.1}
2.2.- { Fin del ciclo del paso 2.1}
3.- { Fin del ciclo del paso 2}

Secuenciales coordinados

La operaciones secuenciales coordinadas implica el procesamiento coordinado de dos o más listas
secuenciales para producir una única lista de salida.
Dichas lista se pueden producir ya sea por: Correspondencia (intersección) Intercalación (unión)

Correspondencia
Las listas deben de estar en orden ascendente.
1. Se inicia con la lectura del nombre inicial del la lista 1 y lo compara con el nombre inicial de la lista
2. Si encuentra una correspondencia se inserta el elemento en un nuevo archivo.

Intercalación
Es la unión de los elementos de dos listas.
La diferencia entre la correspondencia y la intercalación es que con la intercalación debe leerse totalmente cada una de ellas.

.

Ordenamiento Shell



El método de Shell es una versión mejorada del método de inserción directa recibe ese nombre en honor a su autor Donald L. Shell quien lo propuso en 1959. Este método también se conoce con el nombre de inserción con incrementos decrecientes.
En el método se propone que las comparaciones se efectúen con saltos de mayor tamaño, pero con incrementos que sean saltos de mayor tamaño pero con incrementos decrecientes, así los elementos quedarán ordenados en el arreglo.


CARACTERÍSTICAS

• Se trata de un algoritmo de ordenación interna. Al igual que cualquier otro de ordenación interna (los datos están en memoria principal) podría utilizarse para ordenación externa (en memoria secundaria) siempre y cuando se disponga de acceso aleatorio, pero el algoritmo no fue ideado para eso.
• Se basa en comparaciones e intercambios.
• Necesita que el tiempo de acceso a cualquier dato sea constante (es decir, fue ideado para trabajar con arrays, arrays de referencias o punteros, etc...). Ojo a otras estructuras, como listas enlazadas, etc... ya que en ese caso, el tiempo de acceso a un elemento no es constante, depende de la posición del elemento.
• No es estable: dados dos elementos que al compararlos sean "iguales" no mantienen necesariamente el orden relativo inicial entre ellos
• El estudio de su complejidad no es trivial, sino todo lo contrario. La implementación original de Shell tiene una complejidad en el peor caso de O(n2), aunque en un caso promedio o en casos típicos comprobados empíricamente, los resultados son mucho mejores que con la burbuja, selección directa o inserción directa, cuya complejidad en el peor caso también es del orden de O(n2).
• Sin embargo, optimizaciones posteriores han logrado reducir esa cota... Por ejemplo, con la optimización de Robert Sedgewick se llega a O(n4/3), y con la propuesta por Vaughan Pratt se llega al orden de O(n log2n).
• En 1992, Greg Plaxton, Bjorn Poonen y Torsten Suel prueban que es posible incluso rebajar aún más esas cotas.
• En cierto modo, puede considerarse una ampliación del algortimo de inserción directa, con lo cual, conviene tenerlo claro antes de meterse con el de Shell.
• No es un algoritmo en-línea.

EFICIENCIA

El análisis de eficiencia es un problema complicado y aun no resuelto.

Nadie ha sido capaz de establecer la mejor secuencia de incrementos cuando N es muy grande.
Una medida de eficiencia es:
Contar el # de comparaciones (C)
Contar el # de movimientos de items (M)
Estos están en función de el #(n) de items a ser ordenados.
Un "buen algoritmo" de ordenamiento requiere de un orden nlogn comparaciones.
La eficiencia de los algoritmos se mide por el número de comparaciones e intercambios que tienen que hacer, es decir, se toma n como el número de elementos que tiene el arreglo o vector a ordenar y se dice que un algoritmo realiza O(n2) comparaciones cuando compara n veces los n elementos, n x n = n2