Búsqueda y ordenación

Programación II 7-8 de enero de 2009

Funciones
‡ Un concepto fundamental en este curso es la función ‡ Una función no sólo resuelve un problema específico, sino una clase de problemas genéricos ‡ Ejemplo:
± sumar los números enteros 5 y 6 (específico) ± sumar los números enteros a y b (genérico)

Funciones
‡ Una función tiene una entrada y una salida ‡ La entrada es una lista de variables que especifica el tipo de cada variable ‡ La salida es un valor de un tipo determinado ‡ Ejemplo en C:
int sumar(int a, int b)

Funciones ‡ Una función debe resolver correctamente el problema para cualquier valor de las variables de entrada ‡ Por lo tanto. tiene que detallar el proceso completo que lleva a la solución ‡ Una función que no produce ningún resultado se llama acción .

} . return resultado.Ejemplos int sumar(int a. int b) { int resultado = a + b. } void mostrar(int x) { printf("El valor es %d\n". x).

se llama ‡ Llamar a una función consiste en especificar los valores de entrada: int suma = sumar(5.Llamar a funciones ‡ Para resolver un problema específico del tipo resuelto por una función. 6). ‡ Al llamar a una función se ejecuta su proceso con los valores especificados . mostrar(3).

está compuesto por palabras más cercanas al lenguaje natural ‡ Vamos a usar el pseudocódigo para escribir funciones .Pseudocódigo ‡ El pseudocódigo es un lenguaje genérico para escribir funciones ‡ No corresponde a ningún lenguaje de programación (como C o Java) ‡ En cambio.

resultado n a + b. ffuncion accion Mostrar(x:natural) // Mostrar el valor de x en la pantalla faccion . devuelve resultado.Ejemplos funcion Sumar(a:natural. b:natural) devuelve natural variable resultado:natural.

Interpretar programas ‡ La programación no sólo consiste en escribir programas ‡ También es necesario poder interpretar programas de otros programadores ± utilizar el código en su programa ± adaptar el código a problemas parecidos ± ayudar en el proceso de depuración ± verificar que la solución es correcta .

Métodos de Búsqueda y Ordenación Búsqueda lineal Búsqueda lineal con marcador Búsqueda binaria Búsqueda binaria simplificada Esquemas sencillos de ordenación Algoritmo de la Burbuja: Bubble Sort Algoritmo de Inserción: Insertion Sort Algoritmo de Selección: Selection Sort .

Número de preguntas diarias en Google: 400 millones (2006) Por lo tanto. la eficiencia de la búsqueda es importante La ordenación consiste en ordenar los elementos de un conjunto con el fin de acelerar la búsqueda .Métodos de Búsqueda y Ordenación Los problemas más comunes en la informática son la búsqueda y la ordenación.

siempre que sea posible realizar comparaciones (µigualdad¶. µmenor que¶) sobre este tipo. ¿Porqué se llama lineal? . un vector. por ejemplo.Búsqueda lineal Encontrar un elemento determinado dentro de una colección dada. La búsqueda se realiza sobre una estructura de datos de tamaño fijo y conocido. Los algoritmos sirven para hacer búsquedas sobre cualquier tipo de datos.

10 sino 11 devuelve -1. 7 fmientras 8 si ( i e n ) entonces 9 devuelve i .Búsqueda lineal 1 funcion BusquedaLineal (V: vector de natural . 5 mientras ( ( i e n ) y (V[i] { elem) ) hacer 6 i i +1. 2 elem.n : natural ) devuelve entero 3 variable i : natural . 4 i 1. 12 fsi 13 ffuncion .

Búsqueda lineal La instrucción mientras lleva una doble condición: mientras ( ( i e n ) y (V[i] { elem) ) hacer Comprobar que la doble condición se satisface para cada valor de la variable i es ineficiente Una manera de evitar la doble condición es introducir un marcador .

6 mientras (V[i] { elem) hacer 7 i i +1. 13 fsi 14 ffuncion .n : natural ) devuelve entero 3 variable i : natural . 8 fmientras 9 si ( i = n+1 ) entonces 10 devuelve -1. 4 i 1. 2 elem. 11 sino 12 devuelve i.Búsqueda lineal con marcador 1 funcion BusquedaLinealConMarcador (V: vector de natural . 5 V[n+1] elem .

Sin embargo. Para hacerlo es necesario suponer que los elementos del vector estén ordenados. su eficiencia puede ser mejorado de forma considerable. Suponemos que el vector esta ordenado de forma ascendente (de menor a mayor).Búsqueda binaria La búsqueda lineal es la primera idea que ocurre para el problema de la búsqueda. .

buscar en la segunda mitad. La idea es hacer servir la propiedad adicional del vector para acelerar el proceso de búsqueda: 1) Dividir el vector en dos partes iguales. . 2) Si el elemento en el centro del vector es mayor que el elemento buscado. 3) Si el elemento en el centro del vector es menor que el elemento buscado.Búsqueda binaria Si el vector está ordenado (de manera ascendente o descendente). es posible aplicar búsqueda binaria. buscar en la primera mitad.

14 sino 15 D medio . 9 si (V[medio] = elem) entonces 10 encontrado cierto. 16 fsi 17 fsi 18 fmientras 19 si ( encontrado ) entonces 20 devuelve medio.medio : natural . 21 sino 22 devuelve -1. 5 D n. // derecha.1 funcion BusquedaBinaria (V: vector de natural . 3 encontrado : booleano . 23 fsi 24 ffuncion . 11 sino 12 si (V[medio] < elem) entonces 13 E medio + 1.D. 4 E 1. // izquierda.n : natural ) devuelve entero 2 variable E. 7 mientras ( (E e D) y no(encontrado) ) hacer 8 medio (E+D) / 2. elem.1. 6 encontrado := falso .

Búsqueda binaria simplificada De nuevo. cada iteración será más eficiente . es posible que el algoritmo repita más veces el bucle mientras Sin embargo. la instrucción mientras lleva una doble condición mientras ( (E e D) y no(encontrado) ) hacer Es posible mejorar ligeramente la eficiencia eliminando la doble condición Una manera de hacerlo es dejar de comprobar si el elemento en el medio es igual al elemento buscado Con esta modificación.

4 E 1. 12 fsi 13 fmientras 14 si ( (D = n + 1) o (V[D] { elem) ) entonces 15 devuelve -1. 2 elem. 5 D n. 18 fsi 19 ffuncion . 8 si (V[medio] < elem) entonces 9 E medio + 1. 6 mientras (E e D) hacer 7 medio (E+D) / 2. 10 sino 11 D medio. 16 sino 17 devuelve D.1 funcion BusquedaBinariaSimplificada (V: vector de natural .D.n : natural ) devuelve entero 3 variable E.medio : natural .

Eficiencia de la búsqueda ¿Cuál de las dos opciones de búsqueda (lineal. binaria) es más óptimo? .

. Igual que para la búsqueda. vale la pena ordenar los elementos primero. Si necesita buscar muchos datos en un mismo conjunto. la ordenación se puede realizar sobre cualquier tipo de elementos. siempre que se puedan comparar (µmenor que¶).Esquemas sencillos de ordenación Hemos visto como la búsqueda se puede realizar con más eficiencia si los elementos están ordenados.

. existen un gran número de algoritmos de ordenación. un vector).ej. tanto a nivel de memoria como a nivel de tiempo de ejecución.Esquemas sencillos de ordenación Como la ordenación es un problema importante.. También varía su eficiencia. Imponen diferentes tipos de requerimientos sobre los datos a ordenar. Los algoritmos existentes se pueden utilizar en diferentes estructuras de datos (p.

3 Esquemas sencillos de ordenación En general. los algoritmos más eficientes son más complejos y menos intuitivos. pero menos intuitivos. aunque no muy eficientes. . Estudiaremos en total cinco de estos algoritmos. Inserción. Los otros dos (MergeSort y QuickSort son tan MergeSort QuickSort) eficientes como se puede esperar para un algoritmo de ordenación. y Selección) son muy sencillos.3. Los tres primeros (Burbuja.

Su nombre describe de manera intuitiva su funcionamiento. Se basa en el intercambio entre pares de items . Imaginamos que los números menores µpesan menos¶ y µsuben a la superficie¶ como una burbuja.Algoritmo de la Burbuja: Bubble Sort El algoritmo de ordenación de la burbuja es uno de los más fáciles de recordar.

i.j : natural ) 14 variable aux : natural . j. 17 V[j] aux .j : natural . 15 aux V[i] . n : natural ) devuelve vector de natural 2 variable i.Algoritmo de la Burbuja: Bubble Sort 1 funcion Burbuja (V : vector de natural . 7 fsi 8 fpara 9 fpara 10 devuelve V. 11 ffuncion 12 13 accion Intercambiar (V : vector de natural . 3 para i 1 hasta n-1 hacer 4 para j n hasta i+1 pasos ±1 hacer 5 si (V[j] < V[j-1]) entonces 6 Intercambiar(V. 18 faccion . 16 V[i] V[j] . j-1).

bme.hig.cs.Algoritmo de la Burbuja: Animación http://sziami.edu/~alganim/animator/Animator.no/~algmet/animate.ca/spider/harrison/Java/ http://www.hu/~gsala/alg_anims/3/bsort-e.html http://www2.ubc.cs.hope.cs.html .html http://www.

n] para poner en v[0] el marcador o centinela que simplifique la búsqueda de la inserción.i-1] fpara Para simplificar la inserción ampliamos el vector a V[0. i-1] V[i .. 44 55 12 42 94 18 6 i=2 i=3 i=4 i=5 i=6 i=7 i=8 67 44 55 12 44 55 12 42 44 55 12 42 44 55 94 12 18 42 44 55 94 6 6 12 18 42 44 55 94 12 18 42 44 55 67 94 para i=2 hasta n hacer insertar V[i] en V[1..Algoritmo de Inserción: Insertion Sort Se basa en el método seguido por los jugadores de cartas: Sec-destino (ordenada) Secuencia-Origen(por ordenar) V[1 . . n] En cada paso tomamos el elemento V[i] y lo insertamos donde convenga de la secuencia destino. Insertar v[i] en v[0. .i]: si v[i-1]<v[i] hacer intercambiar V[i] por v[i-1] sino terminar fsi . .. .

j : natural ) 14 variable aux : natural . j-1). 18 faccion . 15 aux V[i] . n:natural) devuelve vector de natural 2 variable i.Algoritmo de Inserción: Insertion Sort 1 funcion Insercion(V: vector de natural.j : natural . 17 V[j] aux . 8 j j-1. 6 mientras (V[j] < V[j-1]) hacer 7 Intercambiar(V. 3 V[0] MIN_INT. 2 hasta n hacer 4 para i 5 j i. j. 9 fmientras 10 fpara 11 devuelve V. i. 12 ffuncion 13 accion Intercambiar (V : vector de natural . 16 V[i] V[j] .

edu/~alganim/animator/Animator.ca/spider/harrison/Java/ http://www.ubc.hope.html http://www.no/~algmet/animate.Algoritmo de Inserción: Animación http://sziami.html .cs.cs.bme.hig.html http://www2.cs.hu/~gsala/alg_anims/3/isort-e.

.Algoritmo de Selección: Selection Sort En cada paso seleccionamos el elemento de menor valor de los no ordenados y lo colocamos como primero de los no ordenados: seleccionamos-entre colocamos-en quedará-por-ordenar i=1 v[1.n] Intercambiar v[i] con v[k] fpara Idea opuesta a la de Inserción: ‡Inserción: trabaja sobre los ya ordenados ‡Selección: trabaja sobre los ya ordenados ..n] v[3] v[4.n] v[1] v[2...n] v[2] v[3.n] v[n-1] v[4..n] i=2 v[2.n] i=3 v[3..n] i=n-1 v[n-1....n] El último ya queda ordenado! Para i=1 hasta n-1 hacer Asignar a k el menor valor de v[i.

j. 5 para j i + 1 hasta n hacer 6 si (V[j] < V[menor]) entonces 7 menor j.Algoritmo de Selección: Selection Sort 1 funcion Seleccion(V: vector de natural. menor). 11 fpara 12 devuelve V. i. 8 fsi 9 fpara 10 Intercambiar(V. 13 ffuncion .menor : natural . 1 hasta n .1 hacer 3 para i 4 menor i. n: natural) devuelve vector de natural 2 variable i.

bme.no/~algmet/animate.edu/~alganim/animator/Animator.ca/spider/harrison/Java/ http://www.cs.ubc.html http://www.cs.html http://www2.hig.hu/~gsala/alg_anims/3/ssort-e.html .cs.Algoritmo de Selección: Animación http://sziami.hope.

Eficiencia de la ordenación ¿Cuál es la eficiencia de los algoritmos sencillos de ordenación? Una idea: contar el número de instrucciones que cada algoritmo realiza Hay que tomar en cuenta que las instrucciones dentro de un bucle mientras se repiten varias veces .