Ordenamiento Por Selección

11
Ordenamiento por selección El ordenamiento por selección (Selection Sort en inglés) es un algoritmo de ordenamiento que requiere O operaciones para ordenar una lista de n elementos. Su funcionamiento es el siguiente: Buscar el mínimo elemento de la lista Intercambiarlo con el primero Buscar el mínimo en el resto de la lista Intercambiarlo con el segundo Y en general: Buscar el mínimo elemento entre una posición i y el final de la lista Intercambiar el mínimo con el elemento de la posición i De esta manera se puede escribir el siguiente pseudocódigo para ordenar una lista de n elementos indexados desde el 1: para i=1 hasta n-1 minimo = i; para j=i+1 hasta n si lista[j] < lista[minimo] entonces minimo = j /* (!) */ fin si fin para intercambiar(lista[i], lista[minimo]) fin para Este algoritmo mejora ligeramente el algoritmo de la burbuja. En el caso de tener que ordenar un vector de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector de estructuras más complejas, la operación intercambiar() sería más costosa en este caso. Este algoritmo realiza muchas menos operaciones intercambiar() que el de la burbuja, por lo que lo mejora en algo. Si la línea comentada con (!) se sustituyera por intercambiar(lista[i], lista[j]) tendríamos una versión del algoritmo de la burbuja (naturalmente eliminando el orden intercambiar del final). Otra desventaja de este algoritmo respecto a otros como el de burbuja o de inserción directa es que no mejora su rendimiento cuando los datos ya están ordenados o parcialmente ordenados. Así como, por ejemplo, en el caso de la ordenación de burbuja se requeriría una

description

Ordenamiento Por Selección

Transcript of Ordenamiento Por Selección

Ordenamiento por seleccinElordenamiento por seleccin(Selection Sorteningls) es unalgoritmo de ordenamientoque requiereOoperaciones para ordenar una lista de n elementos.Su funcionamiento es el siguiente: Buscar el mnimo elemento de la lista Intercambiarlo con el primero Buscar el mnimo en el resto de la lista Intercambiarlo con el segundoY en general: Buscar el mnimo elemento entre una posiciniy el final de la lista Intercambiar el mnimo con el elemento de la posiciniDe esta manera se puede escribir el siguiente pseudocdigo para ordenar una lista denelementos indexados desde el 1:para i=1 hasta n-1 minimo = i; para j=i+1 hasta n si lista[j] < lista[minimo] entonces minimo = j /* (!) */ fin si fin para intercambiar(lista[i], lista[minimo])fin paraEste algoritmo mejora ligeramente elalgoritmo de la burbuja. En el caso de tener que ordenar un vector de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector de estructuras ms complejas, la operacinintercambiar()sera ms costosa en este caso. Este algoritmo realiza muchas menos operacionesintercambiar()que el de la burbuja, por lo que lo mejora en algo. Si la lnea comentada con(!)se sustituyera porintercambiar(lista[i], lista[j])tendramos una versin del algoritmo de la burbuja (naturalmente eliminando el ordenintercambiardel final).Otra desventaja de este algoritmo respecto a otros como el de burbuja o de insercin directa es que no mejora su rendimiento cuando los datos ya estn ordenados o parcialmente ordenados. As como, por ejemplo, en el caso de la ordenacin de burbuja se requerira una nica pasada para detectar que el vector ya est ordenado y finalizar, en la ordenacin por seleccin se realizaran el mismo nmero de pasadas independientemente de si los datos estn ordenados o no.Ordenamiento de burbujaLaOrdenacin de burbuja(Bubble Sorten ingls) es un sencilloalgoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambindolos de posicin si estn en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten ms intercambios, lo cual significa que la lista est ordenada. Estealgoritmoobtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeas "burbujas". Tambin es conocido como elmtodo del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparacin, siendo el ms sencillo de implementar.Una manera simple de expresar el ordenamiento de burbuja enpseudocdigoes la siguiente:

Este algoritmo realiza el ordenamiento de una listaadenvalores, en este caso dentrminos numerados del0aln-1, consta de dos bucles anidados uno con el ndicei, que da un tamao menor al recorrido de la burbuja en sentido inverso de2an, y un segundo bucle con el ndicej, con un recorrido desde0hastan-i, para cada iteracin del primer bucle, que indica el lugar de la burbuja.La burbuja son dos trminos de la lista seguidos,jyj+1, que se comparan, si el primero es menor que el segundo sus valores se intercambian.Esta comparacin se repite en el centro de los dos bucles, dando lugar a la postre a una lista ordenada, puede verse que el nmero de repeticiones sola depende den, y no del orden de los trminos, esto es, si pasamos al algoritmo una lista ya ordenada, realizara todas las comparaciones exactamente igual que para una lista no ordenada, esta es una caracterstica de este algoritmo, luego veremos una variante que evita este inconveniente.Para comprender el funcionamiento, veamos un ejemplo sencillo:Tenemos una lista de nmeros que hay que ordenar:

Podemos ver que la lista que tiene cinco trminos, luego:

El ndiceihar un recorrido de2hastan:

Que en este caso ser de 2 a 5. Para cada uno de los valores dei,jtomara sucesivamente los valores de0hastan-i:

Para cada valor dej, obtenido en ese orden, se compara el valor del ndicejcon el siguiente:

Si el terminojes mayor que el terminoj+1, los valores se permutan, en caso contrario se contina con la iteracin.

Para el caso del ejemplo, tenemos que:

Para la primera iteracin del primer bucle:

yjtomara los valores de0hasta3:

Cuandojvale0, se comparan, el 55 y el 86, dado que 55 < 86 no se permutan el orden.Ahorajvale1y se comparanel 86 y el 48 Como 86 > 48, se permutan, dando lugar a una nueva lista.Se repite el proceso hasta quejvalga3, dando lugar a una lista parcialmente ordenada, podemos ver que el termino de mayor valor esta en el lugar ms alto.Ahoraivale3, yjhar un recorrido de0a2.Primerojvale0, se comparan, el 55 y el 48, como 55 > 48 se permutan dando lugar a la nueva lista.Para j = 1 se compara el 55 con el 16 y se cambian de orden.

Para j = 2 se compara el 55 y el 82 y se dejan como estn, finalizando el bucle con una lista mejor ordenada, puede verse que los dos valores ms altos ya ocupan su lugar. No se ha realizado ninguna comparacin con el termino cuarto, dado que ya se sabe que despus del primer ciclo es el mayor de la lista.El algoritmo consiste en comparaciones sucesivas de dos trminos consecutivos, ascendiendo de abajo a arriba en cada iteracin, como la ascensin de las burbujas de aire en el agua, de ah el nombre del procedimiento, en la primera iteracin el recorrido ha sido completo, en el segundo se ha dejado l ltimo termino, al tener ya el mayor de los valores, en los sucesivos s ira dejando de realizar las ultimas comparaciones, como se puede ver.

Ahora yaivale 4 yjrecorrer los valores de 0 a 1.Cuandojvale 0, se comparanesto es el 48 y el 16 dado que 48 es mayor que 16 se permutan los valores, dando lugar a una lista algo ms ordenada que la anterior, desde esta nueva ordenacin,jpasa a valer 1, con lo que se comparan los trminosel 48 y el 55 que quedan en el mismo orden.En este caso la burbuja ha ascendido menos que en los casos anteriores, y la lista esta ya ordenada, pero el algoritmo tendr que completarse, realizando una ultima iteracin.Hay que tener en cuenta que el bucle para realiza un nmero fijo de repeticiones y para finalizar tendrn que completarse, aun en el caso extremo, de que la lista estara previamente ordenada.Por ltimoivale 5 yjsolo puede vale 0, con lo que solo se realizara una comparacin deel 16 y el 48, que ya estn ordenados y se dejan igual.

Los bucles finalizan y tambin el procedimiento, dejando la lista ordenada.Una variante que finaliza en caso de que la lista este ordenada, puede ser la siguiente, como en el ejemplo anterior,empleando un centinelaordenado, que detecta que no se ha modificado la lista en un recorrido de la burbuja, y que por tanto la lista ya esta ordenada, finalizando.

QuicksortElordenamiento rpido(quicksorteningls) es unalgoritmocreado por el cientfico britnico en computacinC. A. R. Hoarebasado en la tcnica dedivide y vencers, que permite, en promedio,ordenarnelementos en un tiempo proporcional anlogn.Descripcin del algoritmoEl algoritmo funciona de la siguiente forma: Elegir un elemento de la lista de elementos a ordenar, al que llamaremospivote. Resituar los dems elementos de la lista a cada lado del pivote, de manera que a un lado queden todos los menores que l, y al otro los mayores. Los elementos iguales al pivote pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la implementacin deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponder en la lista ordenada. La lista queda separada en dos sublistas, una formada por los elementos a la izquierda del pivote, y otra por los elementos a su derecha. Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados.Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el pivote elegido. En el mejor caso, el pivote termina en el centro de la lista, dividindola en dos sublistas de igual tamao. En este caso, el orden de complejidad del algoritmo esO(nlog n). En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces deO(n). El peor caso depender de la implementacin del algoritmo, aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero principalmente depende del pivote, si por ejemplo el algoritmo implementado toma como pivote siempre el primer elemento delarray, y el array que le pasamos est ordenado, siempre va a generar a su izquierda un array vaco, lo que es ineficiente. En el caso promedio, el orden esO(nlog n).No es extrao, pues, que la mayora de optimizaciones que se aplican al algoritmo se centren en la eleccin delpivote.[editar]Demostracin de un caso particularSupongamos que el nmero de elementos a ordenar es una potencia de dos, es decir,para algn natural. Inmediatamente, donde k es el nmero de divisiones que realizar el algoritmo.En la primera fase del algoritmo habr n comparaciones. En la segunda fase el algoritmo instanciar dos sublistas de tamao aproximadamente n/2. El nmero total de comparaciones de estas dos sublistas es: 2(n/2) = n. En la tercera fase el algoritmo procesar 4 sublistas ms, por tanto el nmero total de comparaciones en esta fase es 4(n/4) = n.En conclusin, el nmero total de comparaciones que hace el algoritmo es:, donde, por tanto el tiempo de ejecucin del algoritmo en el mejor caso es.Tcnicas de eleccin del pivoteEl algoritmo bsico del mtodo Quicksort consiste en tomar cualquier elemento de la lista al cual denominaremos como pivote, dependiendo de la particin en que se elija, el algoritmo ser ms o menos eficiente. Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningn clculo adicional, lo cual lo hace bastante rpido. Sin embargo, esta eleccin a ciegas siempre provoca que el algoritmo tenga un orden de O(n) para ciertas permutaciones de los elementos en la lista. Otra opcin puede ser recorrer la lista para saber de antemanoqu elemento ocupar la posicin central de la lista, para elegirlo como pivote. Esto puede hacerse enO(n)y asegura que hasta en el peor de los casos, el algoritmo seaO(nlog n). No obstante, el clculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio. La opcin a medio camino es tomartres elementos de la lista- por ejemplo, el primero, el segundo, y el ltimo - y compararlos, eligiendo el valor del medio como pivote.Tcnicas de reposicionamientoUna idea preliminar para ubicar elpivoteen su posicin final sera contar la cantidad de elementos menores que l, y colocarlo un lugar ms arriba, moviendo luego todos esos elementos menores que l a su izquierda, para que pueda aplicarse la recursividad.Existe, no obstante, un procedimiento mucho ms efectivo. Se utilizan dos ndices:i, al que llamaremosndice izquierdo, yj, al que llamaremosndice derecho. El algoritmo es el siguiente: Recorrer la lista simultneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con j (desde el ltimo elemento). Cuando lista[i] sea mayor que el pivote y lista[j] sea menor, se intercambian los elementos en esas posiciones. Repetir esto hasta que se crucen los ndices. El punto en que se cruzan los ndices es la posicin adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habran sido intercambiados).

EjemploEn el siguiente ejemplo se marcan el pivote y los ndices i y j con las letras p, i y j respectivamente.Comenzamos con la lista completa. El elemento pivote ser el 4:5 - 3 - 7 - 6 - 2 - 1 - 4 p

Comparamos con el 5 por la izquierda y el 1 por la derecha.5 - 3 - 7 - 6 - 2 - 1 - 4 i j p

5 es mayor que 4 y 1 es menor. Intercambiamos:1 - 3 - 7 - 6 - 2 - 5 - 4i j p

Avanzamos por la izquierda y la derecha:1 - 3 - 7 - 6 - 2 - 5 - 4 i j p

3 es menor que 4: avanzamos por la izquierda. 2 es menor que 4: nos mantenemos ah.1 - 3 - 7 - 6 - 2 - 5 - 4 i j p

7 es mayor que 4 y 2 es menor: intercambiamos.1 - 3 - 2 - 6 - 7 - 5 - 4 i j p

Avanzamos por ambos lados:1 - 3 - 2 - 6 - 7 - 5 - 4 iyj p

En este momento termina el ciclo principal, porque los ndices se cruzaron. Ahora intercambiamos lista[i] con lista[sup] (pasos 16-18):1 - 3 - 2 - 4 - 7 - 5 - 6 p

Aplicamos recursivamente a la sublista de la izquierda (ndices 0 - 2). Tenemos lo siguiente:1 - 3 - 2

1 es menor que 2: avanzamos por la izquierda. 3 es mayor: avanzamos por la derecha. Como se intercambiaron los ndices termina el ciclo. Se intercambia lista[i] con lista[sup]:1 - 2 - 3

El mismo procedimiento se aplicar a la otra sublista. Al finalizar y unir todas las sublistas queda la lista inicial ordenada en forma ascendente.1 - 2 - 3 - 4 - 5 - 6 - 7