You are on page 1of 12

qwertyuiopasdfghjklzxcvbnmqw ertyuiopasdfghjklzxcvbnmqwert yuiopasdfghjklzxcvbnmqwertyui opasdfghjklzxcvbnmqwertyuiopa Mapa Comparativo sdfghjklzxcvbnmqwertyuiopasdf Ordenamientos Internos ghjklzxcvbnmqwertyuiopasdfghj klzxcvbnmqwertyuiopasdfghjklz xcvbnmqwertyuiopasdfghjklzxcv bnmqwertyuiopasdfghjklzxcvbn mqwertyuiopasdfghjklzxcvbnmq wertyuiopasdfghjklzxcvbnmqwe

rtyuiopasdfghjklzxcvbnmqwerty uiopasdfghjklzxcvbnmqwertyuio pasdfghjklzxcvbnmqwertyuiopas dfghjklzxcvbnmqwertyuiopasdfg hjklzxcvbnmqwertyuiopasdfghjk


15/04/2011 Juan Carlos Nuez y Ana Karen Ortega

METODO
INSERCI ON

DEFINICI ON
Este mtodo toma cada elemento del arreglo para ser ordenado y lo compara con los que se encuentran en posiciones anteriores a la de l dentro del arreglo. Si resulta que el elemento con el que se est comparand o es mayor que el elemento a ordenar, se recorre hacia la siguiente posicin superior. Si por el contrario, resulta que el elemento con el que se est comparand o es menor que el elemento a ordenar, se detiene el

CREADO R

FILOSOFIA
La idea bsica de una clasificacin por insercin es tomar la siguiente llave de una lista no clasificada e insertarla en su posicin relativa correspondiente en una lista creciente de datos clasificados.

METODOLOGIA
El ordenamiento por insercin tambin puede ser implementado para que funcione sobre una sola lista (o espacio de trabajo) al hacer que el elemento que se est analizando sea insertado entre los que ya han sido analizados y ordenados, vemos esto grficamente:

Se mueve el elemento (en este caso el 2) hasta la posicin que le corresponde y luego se sigue con los dems en la misma forma, logrndose el efecto de la insercin. Una implementacin de este mtodo de ordenamiento puede ser la siguiente: void Insercion(Lista Numeros, int Largo) { int pos1, auxiliar,pos2; for(pos1=1;pos1<Lar go;pos1++) {pos2=pos1; while((pos2>0)&&(Nu meros[pos2]<Numero s[pos2-1])) {auxiliar=Numeros[po s2]; Numeros[pos2]=Num eros[pos2-1]; Numeros[pos21]=auxiliar; pos2--; }; }; };

La lista completa de llaves ordenadas deber estar disponible, a lo largo del proceso, para poder insertar una llave en su posicin relativa apropiada. La lista puede alimentarse durante el proceso.

proceso de comparaci n pues se encontr que el elemento ya est ordenado y se coloca en su posicin (que es la siguiente a la del ltimo nmero con el que se compar).
SELECCI N La idea bsica de un ordenamiento por seleccin es la seleccin repetida de la llave menor restante en una lista de datos no clasificados, como la siguiente llave (dato o registro), en una lista de datos ordenada que crece. El ordenamiento por seleccin con intercambio tiene esencialmente los mismos requerimientos de comparaciones que el ordenamiento por seleccin original, es de O(n^2). Una implementacin de este mtodo de ordenamiento puede ser: void Seleccion(Lista Numeros,int Largo) { int pos1,menor,recorre,auxiliar; /*comienza en la primera posicion y llega hasta uno antes del fin*/ for(pos1=0;pos1<(Largo-1);pos1++) { for(menor=pos1,recorre=pos1+1;recorr e<Largo;recorre++) if(Numeros[menor]>Numeros[recorre]) menor=recorre; auxiliar=Numeros[menor]; Numeros[menor]=Numeros[pos1]; Numeros[pos1]=auxiliar; }; };

Consiste en encontrar el menor de todos los elementos del arreglo e intercambia rlo con el que est en la primera posicin. Luego el segundo ms pequeo, y as sucesivame nte hasta ordenar todo el arreglo.

La totalidad de la lista de llaves no ordenadas, debe estar disponible, para que nosotros podamos seleccionar la llave con valor

mnimo en esa lista. Sin embargo, la lista ordenada, podr ser puesta en la salida, a medida que avancemos.

BURBUJA

El bubble sort, tambin conocido como ordenamien to burbuja, funciona de la siguiente manera: Se recorre el arreglo intercambia ndo los elementos adyacentes que estn desordenad os. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prcticame nte lo que hace es tomar el elemento mayor y lo va recorriendo de posicin en posicin hasta ponerlo en

La idea bsica de este mtodo de ordenamiento es la de comparar pares de valores de llaves e intercambiarlos si no estn en sus posiciones relativas correctas.

El mtodo de la burbuja en realidad es muy poco recomendado, sin embargo, es muy conocido (tal vez debido a su nombre) y desafortunadamente muy utilizado (puede ser debido a su relativa facilidad de implementacin). Su comportamiento es un poco parecido al mtodo de intercambio selectivo, en el cual las llaves ms pequeas bajan al fondo de la lista.

Como los mtodos de seleccin e insercin vistos anteriormente, el mtodo de burbuja requiere O(n^2) comparaciones. No obstante, el mtodo de la burbuja es frecuentemente usado. La idea de este mtodo es la de permitir que cada llave flote a su posicin adecuada a travs de una serie de pares de comparaciones e intercambios

Este mtodo de ordenamiento tambin puede funcionar con 2 listas, una de llaves desordenadas y otra de llaves ordenadas, pasando el elemento que flota hasta el final a la lista de ordenados, pero para minimizar el espacio utilizado, trabajaremos con una sola lista.

Una implementacin del mtodo de ordenamiento por burbuja puede ser el siguiente: void Burbuja(Lista Numeros, int Largo) { int ultimo=Largo-1; int posicion; int auxiliar; while(ultimo>=1) { for(posicion=0;posici on<ultimo;posicion+ +) { if(Numeros[posicion] >Numeros[posicion+ 1]) { auxiliar=Numeros[po sicion];

su lugar.

con los valores adyacentes. Cada paso haces que una llave suba a su posicin final, como una burbuja, en la lista ordenada. Consideremos otra vez nuestro ejemplo de lista de llaves no ordenadas:

Numeros[posicion]= Numeros[posicion+1 ]; Numeros[posicion+1 ]=auxiliar; }; }; ultimo--; }; };

SHELL

Ordenamie nto de disminucin incremental . El mtodo Shell es una versin mejorada del mtodo de insercin directa. Este mtodotam bin se conoce con el nombre de insercin con incremento s decreciente s. En elmtodo de ordenacin por insercin directa cada elemento

Donald Shell

Ordena subgrupos de elementos separados K unidades (respecto de su posicin en el arreglo) del arreglo original. El valor K es llamado incremento. Despus de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K ms pequeo, y el arreglo es de nuevo partido entre el nuevo conjunto de

Shell propone que las comparaciones entre elementos se efecten con saltos de mayortamao pero con incrementos decrecientes, as, los elementos quedarn ordenados en elarreglo ms rpidamente. El Shell sort es una generalizacin del ordenamiento por insercin, teniendo en cuenta dos observaciones: 1.El ordenamiento por insercin es eficiente si la entrada est "casi ordenada". 2.El ordenamiento por insercin es ineficiente, en general, porque mueve los valores slo una posicin cada vez. El algoritmo Shell sort mejora el ordenamiento por insercin comparando elementosseparados por un espacio de varias posiciones. Esto permite que un elemento haga"pasos ms grandes" hacia su posicin esperada. Los pasos mltiples sobre los datos sehacen con tamaos de espacio cada vez ms pequeos.

se compara para su ubicacinco rrecta en el arreglo, con los elementos que se encuentran en la parte izquierda delmismo. Si el elemento a insertar es ms pequeo que el grupo de elementos que seencuentr an a su izquierda, es necesario efectuar entonces varias comparacio nes antes desu ubicacin

subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor ms pequeo de K. Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado. Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el ltimo valor debe ser 1. "Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos." Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica insercin directa. El mtodo se

Elltimo paso del Shell sort esun simple ordenamiento por insercin, pero para entonces, ya est garantizado que losdatos del vector estn casi ordenados.

El mtodo Shell es una versin mejorada del mtodo de insercin directa. Este mtodotambin se conoce con el nombre de insercin con incrementos decrecientes. En elmtodo de ordenacin por insercin directa cada elemento se compara para su ubicacincorrecta en el arreglo, con los elementos que se encuentran en la parte izquierda delmismo. Si el elemento a insertar es ms pequeo que el grupo de elementos que seencuentran a su izquierda, es necesario efectuar entonces varias comparaciones antes desu ubicacin. Shell propone que las comparaciones entre elementos se efecten con saltos de mayortamao pero con incrementos decrecientes, as, los elementos quedarn ordenados en elarreglo ms rpidamente. #include<iostream> #include"leearreglo.h" using namespace std; #define largo 50 void ordenShell(int A[],int n) {int i, j, inc, temp; for(inc = 1 ; inc<n;inc=inc*3+1); while (inc > 0) {

basa en tomar como salto N/2 (siendo N el nmero de elementos) y luego se va reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1.

for (i=inc; i < n; i++)

j = i; temp = A[i]; while ((j >= inc) && (A[j-inc] > temp)) { A[j] = A[j - inc]; j = j - inc; }A[j] = temp; }inc/= 2; } }void main () { nt A[largo],n; do{ cout<<"Cantidad de numeros a ingresar: ";cin>>n; if(n<=0||n>largo) cout<<"Debe ingresar un valor> a 0 y < a "<<largo<<endl; }while(n<=0||n>largo); leeCadena(n,A); ordenShell(A,n); muestraCadena(n,A); }

QUICKSO RT

Considerad o uno de los mejores mtodos de ordenamien to

C.A. R. Hoare (1962)

1. Se selecciona una llave en particular de la lista. Esta llave se puede escoger aleatoriamente o haciendo la media de un pequeo conjunto de llaves tomados de la lista. El valor ptimo sera aqul que est precisamente en medio del rango de valores. Esto se hace para evitar el peor caso de Quicksort, que es seleccionar una llave del extremo. No obstante,

El primer paso se ve de la siguiente forma:

El segundo paso:

Procesar la sublista 1 requiere aproximadamente comparaciones, lo mismo que para procesar la lista 2. De hecho, el proceso de cada superpaso requiere O(n) comparaciones. En promedio se requieren

incluso en el peor de los casos Quicksort funciona correctamente. 2. Se divide la lista en dos partes, una con todos los elementos menores o iguales que la llave seleccionada y otra con todos los elementos mayores o iguales. 3. Se repiten los puntos 1 y 2 para cada parte restante hasta que la lista est ordenada. El proceso descrito es esencialmente recursivo. Veamos ahora un ejemplo prctico de cmo funciona este mtodo de ordenamiento: consideremos la siguiente lista de elementos: 7-5-3-8-910 - 14 - 6 - 4 1 Supongamos que el elemento que se seleccion al azar fue el 8, entonces nuestra lista se divide en dos partes, una con

superpasos para clasificar la lista completa. Luego el mtodo de Quicksort requiere de un promedio de comparaciones. Este es el mejor desempeo encontrado hasta aqu en una tcnica de ordenamiento; recordemos que los mtodos lineales requieren todos de O(n^2) comparaciones. Una implementacin de este mtodo de ordenamiento puede ser la siguiente: void qs(Lista Numeros, int inf, int sup) { int izq=inf, der=sup, mitad, x; mitad=Numeros[(izq+der) /2]; do{ while((Numeros[izq]<mita d)&&(izq<sup))izq++; while((mitad<Numeros[d er])&&(der>inf))der--; if(izq<=der) { x=Numeros[izq], Numeros[izq]=Numeros[d er], Numeros[der]=x; izq++; der--; }; }while(izq<=der); if(inf<der) qs(Numeros,inf,der); if(izq<sup) qs(Numeros,izq,sup); }; void QuickSort(Lista Numeros, int n) { qs(Numeros,0,n-1); }; Cmo podr apreciarse, este algoritmo selecciona el elemento medio de la lista de claves, ya que como se dijo anteriormente se trata de un nmero al azar. Lamentablemente, ste no considera el peor caso, pues puede darse el caso que el elemento medio

los mayores y una con los menores que el 8.

sea exactamente un valor extremo de la lista, pero eso es un punto fcil de solucionar. A pesar de todo, esta implementacin funciona bastante bien.

Si trabajamos con L1, supongamos que seleccionamos el elemento 4 al azar, entonces nuestra lista se divide en dos partes, una con los mayores y una con los menores que el 4.

As sucesivamente hasta que se llega a una lista con dos elementos, los cuales se comparan y se retornan en orden.

HEAPSOR T

Su desempeo es en promedio tan bueno como el Quicksort y se comporta mejor que este ltimo en los peores casos. Aunque el Heapsort tiene un

1964 por J. W. J. Williams.

El Heapsort est basado en el uso de un tipo especial de rbol binario (llamado apilamiento) para estructurar el proceso de ordenamiento. La estructura de ramificacin del rbol conserva el nmero de comparaciones necesarias en

El proceso de sacar el mximo (la raz) lleva en s una serie de pasos ms que son: ** Toma el elemento de la raz y lo intercambia con el elemento ms a la derecha de la rama que est en el nivel ms bajo. Recordemos que el rbol (Heap) se llena de izquierda a derecha, con lo cual, el proceso de sacar la raz se hace en forma inversa (Vaciando el rbol). ** Al intercambiar la raz con el elemento antes mencionado, se produce un quiebre en las condiciones del Heap, con lo cual se debe

mejor desempeo general que cualquier otro mtodo presentado de clasificaci n interna, es bastante complejo de programar.

. La estructura de este rbol tiene las siguientes caractersticas: Las llaves estn acomodadas en los nodos de tal manera que, para cada nodo i, Ki <= Kj donde el nodo j es el padre del nodo i. Es decir, al recorrer el camino desde la raz hacia abajo, las claves se encuentran en orden descendente. El rbol se llena de izquierda a derecha, lo que implica que si algn(os) nodo(s) no est(n) en el mismo nivel que el resto, ste(os) estar(n) entonces lo ms a la izquierda posible del rbol. Veamos grficamente un ejemplo de este tipo de rbol:

reconstruir y volver a dejar en la raz del rbol el elemento que es mayor que todos los dems. Un algoritmo sencillo para visualizar cmo funciona este mtodo de ordenamiento puede ser el siguiente: void HeapSort(Lista Numeros) { Heap=Construir_Heap(Numeros); while(Heap_vacio(Heap)==0) { Auxiliar=Extraer_Max(Heap); Insertar(Ordenada, Auxiliar); Ultimo=Ultimo_Heap(Heap); Numeros=Coloca_Cabeza(Ultimo,Num eros); Heap=Reconstruir_Heap(Heap); }; };

Al enumerar los nodos por niveles, de izquierda a derecha (como se aprecia en la figura), no es necesario usar punteros para almacenar el rbol. En efecto, se puede usar un arreglo A[1..n], donde los hijos de A[i] son A[2*i] y A[2*i+1]. As, la condicin del Heap se puede reformular: A[i] > A[2*i] A[i] > A[2*i+1] Luego un vector con las llaves quedara de la siguiente forma: 73 - 50 - 36 - 21 - 46 - 27 - 9 - 18 - 10 - 30 Resumiendo, el ordenamiento por Heapsort realiza los siguientes pasos desde un punto de vista de un Heap (con los elementos) y una lista ordenada (inicialmente

vaca): 1. Saca el valor mximo del Heap. (El de la posicin 1). 2. Pone el valor sacado en el arreglo ordenado. 3. Reconstruir el Heap con un elemento menos.

You might also like