Sunteți pe pagina 1din 7

Algortmica y Lenguajes de Programacin Ordenacin (i)

Ordenacin. Introduccin
n

A lo largo del curso hemos visto distintas formas de almacenar datos:


n n n n

Vectores. Matrices. Ficheros Listas (pilas y colas)

Aunque no se han estudiado, existen ms estructuras de datos como rboles y grafos. Todas estas estructuras sirven para almacenar informacin de un modo adecuado que permita su recuperacin (bsqueda) de la forma ms eficiente posible. Por ello, los algoritmos de ordenacin son fundamentales y, como ejemplos tpicos (y sencillos), estudiaremos algunos de los algoritmos de ordenacin de vectores ms comunes.
2

Ordenacin. Caractersticas de los vectores


n

Las dos caractersticas principales de los vectores son las siguientes:


1.

2.

Se accede a sus componentes de forma directa; por ejemplo: a(3) permite acceder (para leer o escribir) la tercera componente de un vector denominado a. Los vectores tienen un tamao fijo que queda determinado en el momento de su declaracin; por ejemplo, la declaracin coordenadas vector (3) de real limita el tamao del vector coordenadas a 3 componentes.
3

Ordenacin. Algoritmos de tratamiento de


vectores
n

Los algoritmos de tratamiento de vectores responden a tres esquemas bsicos:


1. 2.

3.

Recorrido: procesar todos los elementos del vector. Bsqueda: recorrer el vector hasta encontrar una componente que cumple una propiedad determinada. Ordenacin: recolocar los elementos del vector para que mantengan una determinada relacin de orden.

El primer esquema es muy sencillo, en esta leccin nos centraremos en la ordenacin dejando para su posterior estudio los algoritmos de bsqueda.
4

Ordenacin. Algoritmos de ordenacin


n

Los algoritmos de ordenacin (ya sean de vectores o de otro tipo de estructura de datos) deben obtener una permutacin ordenada de los elementos presentes en la estructura. La mayora de algoritmos de ordenacin de vectores se basan en realizar intercambios entre las componentes del mismo. Existen mltiples algoritmos de ordenacin de vectores diferencindose por su eficiencia; nosotros estudiaremos los siguientes:
n n n n

Mtodo de la burbuja. Mtodo de la burbuja con seal. Ordenacin por sacudida. Ordenacin rpida (quicksort ).

Ordenacin. Mtodo de la burbuja (i)


n n

La idea bsica de este algoritmo consiste en considerar todos los intercambios posibles hasta deshacer todas las inversiones existentes en el vector. En todos los ejemplos que se presenten se utilizar un tipo ficticio elemento para el que se supone que existe una relacin de orden.
subrutina burbuja (v vector(MAX) de elemento) variables i,j entero temp elemento inicio desde i1 hasta MAX-1 hacer desde j MAX hasta i+1 con paso 1 hacer si v(j)<v(j-1) entonces tempv(j) v(j)v(j-1) v(j-1) temp fin si fin desde fin desde fin

Ordenacin. Mtodo de la burbuja (ii)


i j 3 2 1 v(j)<v(j-1)? v(3)<v(2)? 1<2? verdadero temp: 1 i j 3 2 2 v(j)<v(j-1)? v(3)<v(2)? 1<2? verdadero temp: 1 i j 3 1 2 v(j)<v(j-1)? v(3)<v(2)? 1<2? verdadero temp: 1 i j 3 1 2 v(j)<v(j-1)? v(2)<v(1)? 1<3? verdadero temp: 1 i j 3 3 2 v(j)<v(j-1)? v(2)<v(1)? 1<3? verdadero temp: 1 i j 1 3 2 v(j)<v(j-1)? v(2)<v(1)? 1<3? verdadero temp: 1 i j 1 3 2 v(j)<v(j-1)? v(3)<v(2)? 2<3? verdadero temp: 2 i j 1 3 3 v(j)<v(j-1)? v(3)<v(2)? 2<3? verdadero temp: 2 i j 1 2 3 v(j)<v(j-1)? v(3)<v(2)? 2<3? verdadero temp: 2

Ordenacin. Mtodo de la burbuja (iii)


n

Eficiencia del mtodo de la burbuja


La parte ms interna del algoritmo tiene una complejidad O(1). La complejidad de la estructura alternativa tambin es O(1) puesto que la expresin lgica a evaluar tiene un coste unitario. El bucle j se ejecuta entre 1 y MAX-1 veces as que tomaremos un valor mximo y supondremos que se ejecutar MAX-1 veces; as la complejidad del mismo sera O((MAX-1)1) o lo que es lo mismo O(MAX). El bucle i se ejecuta MAX-1 veces por lo que la complejidad final del algoritmo sera O((MAX-1)MAX) o lo que es lo mismo O(MAX2), puesto que MAX es el tamao mximo del vector, es decir, el tamao del problema la complejidad del mtodo de la burbuja es O(n2). El problema de este algoritmo radica en que ejecuta siempre el mismo nmero de pasos independientemente de si el vector est ordenado o no.

desde i 1 hasta MAX-1 hacer desde j MAX hasta i+1 con paso 1 hacer si v(j)<v(j-1) entonces temp v(j) v(j) v(j-1) v(j-1) temp fin si Asntota para el tiempo de ejecucin fin desde 140 fin desde
Tiempo mximo de ejecucin 120

100

80

60

40

20

0 10 20 30 40 50 Tamao del problema

Ordenacin. Mtodo de la burbuja (iv)


subroutine burbuja (vector) implicit none integer vector(max) integer i,j do i=1,max-1 do j=max,i+1,-1 if (vector(j)<vector(j-1)) then temp=vector(j) vector(j)=vector(j-1) vector(j-1)=temp end if end do end do end subroutine

Ordenacin. Burbuja con seal (i)


Se modifica el algoritmo de la burbuja para disponer de un indicador que seale si se ha producido algn intercambio. En el momento en que no hay ningn intercambio el vector ya est totalmente ordenado y se puede parar. Este algoritmo tambin tiene una complejidad O(n2) salvo para el caso de un vector ordenado, en esa situacin la complejidad es O(n) frente a la burbuja tradicional que tambin sera O(n2) en ese caso.
subrutina burbuja (v vector(MAX) de elemento) variables i,j entero temp elemento bandera logico inicio i 1 bandera falso mientras i<MAX y no bandera hacer j MAX bandera verdadero mientras j>i hacer si v(j)<v(j-1) entonces temp v(j) v(j) v(j-1) v(j-1) temp bandera falso fin si j j-1 fin mientras i i+1 fin mientras fin 10

Ordenacin. Burbuja con seal (ii)


bandera:falso i j 1 2 3 v(j)<v(j-1)? v(3)<v(2)? 3<2? falso temp: ? bandera:verdadero i j 1 2 3 v(j)<v(j-1)? v(2)<v(1)? 2<1? falso temp: ? bandera:verdadero

Como se puede apreciar, en caso de que el vector est inicialmente ordenado, el mtodo de la burbuja con seal ejecuta el bucle ms interno de forma completa una sola vez; de ah que la complejidad de este algoritmo para el caso mejor sea O(n).
Pasos ejecutados para ordenar un vector ya ordenado
50 Pasos ejecutados 45 40 35 30 25 20 15 10 5 0 1 2 3 4 5 6 7 8 9 10 Tamao del vector Burbuja Burbuja seal

FIN DE LA EJECUCIN

11

Ordenacin. Burbuja con seal (iii)


subroutine burbujaSenal (vector) implicit none integer vector(max) integer i,j logical bandera i=1 bandera=.false. do while ((i<max).and.(.not.(bandera))) j=max bandera=.true. do while (j>i) if (vector(j)<vector(j-1)) then temp=vector(j) vector(j)=vector(j-1) vector(j-1)=temp bandera=.false. end if j=j-1 end do i=i+1 end do end subroutine

12

Ordenacin. Resumen
n n

Los algoritmos de ordenacin son fundamentales, un ejemplo tpico y muy sencillo de los mismos son los algoritmos de ordenacin de vectores. Las dos caractersticas principales de los vectores son las siguientes:
1. 2.

Se accede a sus componentes de forma directa. Los vectores tienen un tamao fijo determinado en el momento de su declaracin.

Los algoritmos de tratamiento de vectores responden a tres esquemas bsicos: recorrido, bsqueda y ordenacin. Los algoritmos de ordenacin deben obtener una permutacin ordenada de los elementos presentes en la estructura. La mayora de algoritmos de ordenacin de vectores se basan en realizar intercambios entre las componentes del mismo. En la leccin de hoy se han estudiado los mtodos de la burbuja y la burbuja con seal; ambos tienen una complejidad O(n2) salvo para el caso mejor (un vector ya ordenado), en esa situacin la burbuja con seal tiene complejidad O(n).
13

S-ar putea să vă placă și