24
Métodos de Ordenamiento Codificados en C++

Ordenamiento en C++

Embed Size (px)

Citation preview

Métodos de Ordenamiento Codificados en C++

ORDENAMIENTO

Es la operación de arreglar los registros de una tabla en algúnorden secuencial de acuerdo a un criterio de ordenamiento.

El ordenamiento se efectúa con base en el valor de algún campoen un registro.

El propósito principal de un ordenamiento es el de facilitar lasbúsquedas de los miembros del conjunto ordenado.

El ordenar un grupo de datos significa mover los datos o susreferencias para que queden en una secuencia tal querepresente un orden, el cual puede ser numérico, alfabético oincluso alfanumérico, ascendente o descendente.

1. ORDENAMIENTO POR SELECCIÓN

DESCRIPCIÓN.

• Buscas el elemento más pequeño de la lista.• Lo intercambias con el elemento ubicado en la primera posición

de la lista.• Buscas el segundo elemento más pequeño de la lista.• Lo intercambias con el elemento que ocupa la segunda posición

en la lista.• Repites este proceso hasta que hayas ordenado toda la lista.

ANÁLISIS DEL ALGORITMO.

• Requerimientos de Memoria:

Al igual que el ordenamiento burbuja, este algoritmo sólonecesita una variable adicional para realizar los intercambios.

• Tiempo de Ejecución:

El ciclo externo se ejecuta n veces para una lista de nelementos. Cada búsqueda requiere comparar todos loselementos no clasificados.

Ventajas:

• Fácil implementación.• No requiere memoria adicional.• Rendimiento constante: poca diferencia entre el peor y el

mejor caso.

Desventajas:

• Lento.• Realiza numerosas comparaciones.

Codificación en C++

2. ORDENAMIENTO POR INSERCIÓN DIRECTA

DESCRIPCIÓN.El algoritmo de ordenación por el método de inserción directa es un

algoritmo relativamente sencillo y se comporta razonablemente bien en grancantidad de situaciones. Completa la tripleta de los algoritmos de ordenaciónmás básicos y de orden de complejidad cuadrático, junto con Selection Sort yBubble Sort.

Se basa en intentar construir una lista ordenada en el interior del array aordenar. De estos tres algoritmos es el que mejor resultado da a efectosprácticos. Realiza una cantidad de comparaciones bastante equilibrada conrespecto a los intercambios, y tiene un par de características que lo hacenaventajar a los otros dos en la mayor parte de las situaciones.

Este algoritmo se basa en hacer comparaciones, así que para que realicesu trabajo de ordenación son imprescindibles dos cosas: un array o estructurasimilar de elementos comparables y un criterio claro de comparación, tal quedados dos elementos nos diga si están en orden o no.

• En cada iteración del ciclo externo los elementos 0 a i forman una lista ordenada.

ANÁLISIS DEL ALGORITMO.

• Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable.

• Requerimientos de Memoria: Una variable adicional para realizar los intercambios.

• Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces. El ciclo interno se ejecuta como máximo una vez en la primera iteración, 2 veces en la segunda, 3 veces en la tercera, etc.

Ventajas:

• Fácil implementación.• Requerimientos mínimos de memoria.

Desventajas:

• Lento.• Realiza numerosas comparaciones.

Este también es un algoritmo lento, pero puede ser de utilidad para listas que están ordenadas o semi-ordenadas, porque en ese caso realiza muy pocos desplazamientos.

3. MÉTODO DE ORDENAMIENTO POR INSERCIÓN BINARIA

El método de ordenación por 'inserción binaria'' es unamejora del método de inserción directa.

Para lograr esta mejora se recurre a una búsquedabinaria en lugar de una búsqueda secuencial para insertar unelemento en la parte izquierda del arreglo, que ya seencuentra ordenado.

El resto del procedimiento es similar al de insercióndirecta, es decir, se repite este mismo procedimiento desde elsegundo término hasta el último elemento.

ALGORITMO / INSERCION BINARIA (A, N)

{para (i=2 hasta N){aux = A[i];izq=1;der=i-1;mientras (izq<=der)

{m=[parte entera ((izq+der)/2)];si (aux<A[M])

{der=m-1;}

si no{izq=m+1;}

}j=i-1;mientras (j>=izq)

{A[j+1]=A[j];j=j-11;}

A[izq]=auz;}

4. ORDENAMIENTO POR EL MÉTODO DE SHELL

El método Shell es una versión mejorada del método deinserción directa. Este método también se conoce con el nombre deinserción con incrementos decrecientes.

En el método de ordenación por inserción directa cadaelemento se compara para su ubicación correcta en el arreglo, con loselementos que se encuentran en la parte izquierda del mismo.

Si el elemento a insertar es más pequeño que el grupo deelementos que se encuentran a su izquierda, es necesario efectuarentonces varias comparaciones antes de su ubicación.

Shell propone que las comparaciones entre elementos seefectúen con saltos de mayor tamaño pero con incrementosdecrecientes, así, los elementos quedarán ordenados en el arreglo másrápidamente.

El Shell sort es una generalización del ordenamiento por inserción, teniendo en cuenta dos observaciones:

1. El ordenamiento por inserción es eficiente si la entrada está "casi ordenada".

2. El ordenamiento por inserción es ineficiente, en general, porque mueve los valores sólo una posición cada vez. El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasos más grandes" hacia su posición esperada.

Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado que los datos del vector están casi ordenados. El Shell sort lleva este nombre en honor a su inventor, Donald Shell, que lo publicó en 1959.

ORDENAMIENTO QUICK SORT

El ordenamiento por partición (Quick Sort) se puede definir enuna forma más conveniente como un procedimiento recursivo. Tieneaparentemente la propiedad de trabajar mejor para elementos deentrada desordenados completamente, que para elementos semi-ordenados.

Esta situación es precisamente la opuesta al ordenamiento deburbuja. Este tipo de algoritmos se basa en la técnica "divide yvencerás", o sea es más rápido y fácil ordenar dos arreglos o listas dedatos pequeños, que un arreglo o lista grande.

Normalmente al inicio de la ordenación se escoge un elementoaproximadamente en la mitad del arreglo, así al empezar a ordenar, sedebe llegar a que el arreglo este ordenado respecto al punto de divisióno la mitad del arreglo.

Se podrá garantizar que los elementos a la izquierda de lamitad son los menores y los elementos a la derecha son los mayores.Los siguientes pasos son llamados recursivos con el propósito deefectuar la ordenación por partición al arreglo izquierdo y al arregloderecho, que se obtienen de la primera fase.

El tamaño de esos arreglos en promedio se reduce a la mitad.Así se continúa hasta que el tamaño de los arreglos a ordenar es 1, esdecir, todos los elementos ya están ordenados.

En promedio para todos los elementos de entrada de tamañon, el método hace O (n logn) comparaciones, el cual es relativamenteeficiente.

ORDENAMIENTO HEAP SORT

El ordenamiento por montículos (Heap sort) es un algoritmo de ordenación norecursivo, no estable, con complejidad computacional O(n log n).

Este algoritmo consiste en almacenar todos los elementos del vector a ordenaren un montículo (heap), y luego extraer el nodo que queda como nodo raíz delmontículo (cima) en sucesivas iteraciones obteniendo el conjunto ordenado.

Basa su funcionamiento en una propiedad de los montículos, por la cual, lacima contiene siempre el menor elemento (o el mayor, según se haya definido elmontículo) de todos los almacenados en él.

El significado de heap en ciencia computacional es el de una cola de prioridades (priorityqueue). Tiene las siguientes características:

• Un heap es un arreglo de n posiciones ocupado por los elementos de lacola.(Nota: se utiliza un arreglo que inicia en la posición 1 y no en cero, de talmanera que al implementarla en C se tienen n+1 posiciones en el arreglo.)

• Se mapea un árbol binario de tal manera en el arreglo que el nodo en laposición i es el padre de los nodos en las posiciones (2*i) y (2*i+1).

• El valor en un nodo es mayor o igual a los valores de sus hijos. Por consiguiente,el nodo padre tiene el mayor valor de todo su subárbol.

PROCEDIMIENTO

Heap Sort consiste esencialmente en:

• Convertir el arreglo en un heap.• Construir un arreglo ordenado de atrás hacia adelante

(mayor a menor)repitiendo los siguientes pasos:• Sacar el valor máximo en el heap (el de la posición 1)• Poner ese valor en el arreglo ordenado• Reconstruir el heap con un elemento menos• Utilizar el mismo arreglo para el heap y el arreglo

ordenado.

Fuente:UNIVERSIDAD CONTINENTAL DE CIENCIAS E INGENIERÍAShttp://es.scribd.com/doc/1739233/Ordenamiento-en-C