Algorítmica y Lenguajes de Programación
Ordenación (i)
2
Ordenación.
Introducción
n
A lo largo del curso hemos visto distintas formas de almacenar
datos:
n
Vectores.
nMatrices.
nFicheros
n
Listas (pilas y colas)
n
Aunque no se han estudiado, existen más estructuras de datos
como árboles y grafos.
n
Todas estas estructuras sirven para
almacenar información de
un modo adecuado que permita su recuperación
(búsqueda) de la forma más eficiente posible
.
n
Por ello,
los algoritmos de ordenación son fundamentales
y,
como ejemplos típicos (y sencillos), estudiaremos algunos de los
algoritmos de ordenación de vectores
más comunes.
3
Ordenación.
Características de los vectores
n
Las dos
características principales de
los vectores
son las siguientes:
1.
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
.
2.
Los vectores tienen un
tamaño fijo
que queda
determinado en el momento de su declaración;
por ejemplo, la declaración
coordenadas
∈
∈
vector (3) de real
limita el tamaño del vector
coordenadas
a 3
componentes.
4
Ordenación.
Algoritmos de tratamiento de
vectores
n
Los algoritmos de
tratamiento de vectores
responden a tres esquemas básicos:
1.
Recorrido:
procesar todos los elementos del vector.
2.Búsqueda:
recorrer el vector hasta encontrar una
componente que cumple una propiedad determinada.
3.
Ordenación:
recolocar los elementos del vector para que
mantengan una determinada relación de orden.
n
El primer esquema es muy sencillo, en esta lección
nos centraremos en la ordenación dejando
para su posterior estudio los algoritmos de
búsqueda
.
5
Ordenación.
Algoritmos de ordenación
nLos
algoritmos de ordenación
(ya sean de
vectores o de otro tipo de estructura de datos) deben
obtener una
permutación ordenada de los
elementos presentes en la estructura
.
n
La mayoría de
algoritmos de ordenación de
vectores
se basan en realizar
intercambios entre
las componentes
del mismo.
n
Existen
múltiples algoritmos de ordenación
de
vectores diferenciándose por su eficiencia; nosotros
estudiaremos los siguientes:
n
Método de la burbuja.
n
Método de la burbuja con señal.
n
Ordenación por sacudida.
n
Ordenación rápida (
quicksort
).
6
Ordenación.
Método de la burbuja (i)
n
La idea básica de este algoritmo consiste en considerar todos los
intercambios posibles hasta deshacer todas las inversiones existentes
en el vector.
n
En todos los ejemplos que se presenten se utilizará un tipo ficticio
elemento
para el que se supone que existe una relación de orden.
subrutina burbuja (v
∈
∈
vector(MAX) de elemento)
variables
i,j
∈
∈
entero
temp
∈
∈
elemento
inicio
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
fin desde
fin desde
fin
7
Ordenación.
Método 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 8
Ordenación.
Método de la burbuja (iii)
n
Eficiencia del método de la burbuja
La parte más internadel algoritmo tiene una complejidad O(1).
La complejidad de la estructura alternativatambién es O(1)puesto que la expresión lógica a evaluar tiene un coste unitario.
El bucle jse ejecuta entre 1 y MAX-1 veces así que
tomaremos un valor máximo y supondremos que se ejecutará MAX-1 veces; así la complejidad del mismo sería O((MAX-1)·1) o lo que es lo mismo O(MAX). El bucle ise ejecuta MAX-1 veces por lo que la
complejidad final del algoritmo sería O((MAX-1)·MAX) o lo que es lo mismo O(MAX2), puesto que MAX es el
tamaño máximo del vector, es decir, el tamaño del problema la complejidad del método de la burbuja es O(n2).
El problema de este algoritmo radica en que ejecuta siempre el mismo número 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 fin desde fin desde
Asíntota para el tiempo de ejecución
0 20 40 60 80 100 120 140 10 20 30 40 50 Tamaño del problema
9
Ordenación.
Método 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 10
Ordenación.
Burbuja con señal (i)
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
Se modifica el algoritmo de la burbuja
para disponer de un indicador que
señale si se ha producido algún
intercambio.
En el momento en que no hay
ningún intercambio el vector ya
está totalmente ordenado y se
puede parar
.
Este algoritmo también tiene una
complejidad O(n
2) salvo para el
caso de un vector ordenado
, en
esa situación la complejidad es
O(n)
frente a la burbuja tradicional que
también sería O(n
2) en ese caso.
11 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 FIN DE LA EJECUCIÓN
Ordenación.
Burbuja con señal (ii)
n
Como se puede apreciar, en caso de que el
vector esté inicialmente ordenado, el método
de la burbuja con señal ejecuta el bucle más
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 0 5 10 15 20 25 30 35 40 45 50 1 2 3 4 5 6 7 8 9 10
Tamaño del vector
Pasos ejecutados
Burbuja Burbuja señal
12
Ordenación.
Burbuja con señal (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
13
Ordenación.
Resumen
n
Los algoritmos de ordenación son fundamentales
, un ejemplo típico
y muy sencillo de los mismos son los
algoritmos de ordenación de
vectores
.
n
Las dos
características principales de los vectores
son las siguientes:
1.
Se
accede a sus componentes de forma directa
.
2.
Los vectores tienen un
tamaño fijo
determinado en el momento de su
declaración.
n
Los algoritmos de
tratamiento de vectores
responden a tres esquemas
básicos:
recorrido
,
búsqueda
y
ordenación
.
n
Los
algoritmos de ordenación
deben obtener una
permutación
ordenada de los elementos presentes en la estructura
.
n
La mayoría de
algoritmos de ordenación de vectores
se basan en
realizar
intercambios entre las componentes
del mismo.
n