Está en la página 1de 80

Algoritmos y Programacin Clase 8

Ordenamiento y Bsqueda Anexo: Uso de Procedimientos Sub y Procedimientos Function


1

EXAMEN
1. 2.

Lunes 16 de abril 4 pm. Tema: Lo visto hasta la clase de hoy.

Clase 8

Contenido
Ordenamiento y Bsqueda
1.1 Ejemplos. 1.2 Mtodos de Ordenamiento:

Intercambio o Burbuja Seleccin Insercin (Anexo, para estudiar) Secuencial Binaria


3

1.3 Mtodos de bsqueda:


Clase 8

1.1 Ejemplos

Ordenamiento y bsqueda:

En el directorio telefnico. En el diccionario. Inventarios. Lista de carns. Billetes (con repeticin)


Facturacin, proveedores. Biblioteca, etc.

Clase 8

Ordenamiento

El ordenamiento de una serie de datos puede ser ascendente o descendente:


Orden ascendente: X1 X2 ... Xi-1 Xi Xi+1 ... Xn Orden descendente: X1 X2 ... Xi-1 Xi Xi+1 ... Xn

Clase 8

Mtodos de ordenamiento

Cinco mtodos bsicos de ordenamiento de vectores: Intercambio (Burbuja) Seleccin Insercin *Shell Tarea *QuickSort

Ejemplo: Un mazo de cartas, de una sola pinta.


6

Clase 8

1.2.1 Mtodo de Ordenamiento Intercambio (Burbuja)

Intercambio (Burbuja), cont.


1. Desplegar las cartas sobre una mesa,en lnea, figuras hacia arriba

Para abreviar la explicacin del algoritmo se toma un subconjunto del mazo de cartas, por ejemplo el conformado por las cartas que se muestran. Clase 8
8

Intercambio (Burbuja), cont.


2. Intercambiar las cartas que estn desordenadas: (se compara la primera con todas las dems) 1 2 3 4 5 6 7

2.1 La carta de la primera posicin es mayor que la carta ubicada en la segunda posicin. Hay que efectuar intercambio. La carta 5 se lleva a la posicin 1, y la carta 99 Clase 8 a la posicin 2.

Intercambio (Burbuja), cont.


2. Intercambiar las cartas que estn desordenadas: (se compara la primera con todas las dems)

2.1 La carta en la primera posicin se lleva a una ubicacin temporal. Clase 8

Esta carta se ubicar en la segunda posicin


10

Intercambio (Burbuja), cont.


La carta en la ubicacin temporal se lleva a la segunda posicin. As se ha efectuado un proceso de intercambio (transposicin, permutacin).

11

Clase 8

Intercambio (Burbuja), cont.

RESULTADO PARCIAL DEL ORDENAMIENTO

12

Clase 8

Intercambio (Burbuja), cont.

Ahora, la carta 5 es la primera, y es menor que la carta 9. Es decir, NO se realiza intercambio. Luego la carta 5 se compara con la siguiente (4). La carta 5 es mayor que la 4. Entonces S se efecta el intercambio.

13

Clase 8

Intercambio (Burbuja), cont.

RESULTADO PARCIAL DEL ORDENAMIENTO

La carta 4, en la posicin 3, se lleva a una ubicacin temporal; la carta 5, en la posicin 1, se lleva a la posicin 3; y la carta 4 se lleva de la posicin temporal a la posicin 1.
Clase 8

14

Intercambio (Burbuja), cont.

La carta 4, en la posicin 1, se compara con las dems; el intercambio se hace con la carta 2, que est en la posicin 5.

15

Clase 8

Intercambio (Burbuja), cont.


2. Intercambiar las cartas que estn desordenadas: (se compara la primera con todas las dems) 1 2 3 4 5 6 7

2.2 La carta 2, ahora en la posicin 1, es la de menor valor.


16

Clase 8

Intercambio (Burbuja), cont.

2. Intercambiar las cartas que estn desordenadas: (se compara la segunda con todas las dems) 1 2 3 4 5 6 7

El proceso de intercambio se repite hasta que las cartas estn ordenadas ascendentemente. 17
Clase 8

Intercambio (Burbuja), cont.


3. Finalizar cuando todas las cartas estn ordenadas: 1 2 3 4 5 6 7

Este mtodo implica dos iteraciones: una que toma cada carta; y otra que compara la carta tomada con todas las dems; en dicha comparacin se decide efectuar, o no, 18 Clase 8 el intercambio.

Intercambio (Burbuja)

Ordenar ascendentemente:

1. Desplegar las cartas sobre una mesa, en lnea, figuras hacia arriba. 2. Intercambiar las cartas que estn desordenadas:
2.1 Llevar la carta con nmero inferior a la posicin de la carta con la cual se va a intercambiar. 2.2 Llevar la carta con nmero superior a la posicin de la carta descrita en 2.1.

3. Repetir el paso 2, hasta que no se encuentren cartas desordenadas.


19

Clase 8

Intercambio (Burbuja), cont.


El algoritmo en Visual Basic:


For i = 1 To N-1 For j= i+1 To N If(X(j) > X(i))Then temp = X(i) Mximo X(i) = X(j) N-1 N-1 X(j) = temp End if Next j Next i
2 Nmero de comparaciones ~ N Clase 8
20

Intercambio (Burbuja), cont.


Ejemplo de la funcin de la variable Temporal (Temp):

Temp Clase 8

21

Intercambio (Burbuja), cont.


Ejemplo de la funcin de la variable Temporal (Temp): 1

Temp Clase 8

22

Intercambio (Burbuja), cont.


Ejemplo de la funcin de la variable Temporal (Temp): 2

Temp Clase 8

23

Intercambio (Burbuja), cont.


Ejemplo de la funcin de la variable Temporal (Temp): 3

Temp Clase 8

24

1.2.1 Intercambio (Burbuja), cont.


# de comparaciones

Algoritmo exponencial ~ N2

nmero de elementos
25

Clase 8

1.2.2 Mtodo de Ordenamiento Seleccin

26

2 Mtodo de Seleccin, cont.


1. Desplegar las cartas sobre una mesa
figuras hacia arriba

27

Clase 8

Mtodo de Seleccin, cont.


2. Retirar la carta de menor valor y ubicarla en otro sitio:

28

Clase 8

Mtodo de Seleccin, cont.

3. Del mazo restante en la mesa, seleccionar la carta de menor valor, retirarla de la mesa y ponerla en el otro sitio, detrs de la anterior.

29

Clase 8

Mtodo de Seleccin, cont.


4. Al finalizar, las cartas estarn ordenadas ascendentemente:

Puede demostrarse que el mtodo de seleccin requiere un nmero de comparaciones de (N2 - N)/2. En el mejor de los casos, el nmero de intercambios es cero y en el peor de los casos es (N2 - N)/2. 30
Clase 8

Ejemplo utilizando el Mazo de Cartas de una sola pinta


1.Desplegar las cartas sobre una mesa, figuras hacia arriba. 2.Seleccionar la carta de menor valor, retirarla de la mesa, ponerla en la mano. 3.Del mazo restante en la mesa, seleccionar la carta de menor valor, retirarla de la mesa y ponerla en la mano, detrs de la anterior. 4.Repetir paso 3. Al terminar, las cartas estn ordenadas en la mano.
31

Clase 8

Mtodo de Seleccin, cont.


Programa en Visual Basic:

For i = 1 To N-1 c = i : t = X(i) For j = i+1 To N If(X(j) >= t)Then c = j : t = X(j) End If Next j X(c) = X(i) X(i) = t Next i
32

Clase 8

Eficiencia de los Mtodos


Algunos parmetros a considerar son: 1.Nmero de comparaciones que se efectan. 2.Nmero de intercambios de posicin (transposiciones) que se ejecutan.

Las transposiciones toman la mayor parte del tiempo.


33

Clase 8

1.3 Mtodos de Bsqueda


La bsqueda implica hallar un elemento en una lista de datos. Mtodos de bsqueda: Secuencial Binaria

Clase 8

1.3.1 Bsqueda Secuencial

35

Bsqueda Secuencial
Lectura de datos vector A(N) K=0 Do k=k+1 Loop Until(Dato = A(k) or k=N)
~N

El arreglo puede estar, o no estar, ordenado .


Clase 8

Bsqueda Secuencial
If k = n And dato <> a(k) Then Text1.Text = "dato no encontrado " Else Text1.Text = "Posicin " & k Text2.Text = "Dato " & dato End If
37

Clase 8

1.3.2 Bsqueda Binaria

38

2 Bsqueda Binaria

El arreglo est ordenado ascendentemente: 1. Comparar el dato buscado con el elemento del medio. 1.1. Si aquel es menor que el dato del medio, entonces la bsqueda se hace en la primera mitad. 1.2. De lo contrario, el dato buscado puede estar en la segunda mitad. 2. Repetir el proceso hasta que se encuentre el dato buscado, o hasta que se agoten los elementos.
Clase 8

Bsqueda Binaria A() es un vector ordenado ascendentemente y se esta


Inf m=(Inf+Sup)/2 Sup

buscando un dato entre los lmites superior e inferior.

[a1 a2

a3

a4 am

aj

an]

Si dato buscado < am Sup = m-1

Si dato buscado > am

Inf = m+1 Si dato buscado = am La posicin buscada = m


Clase 8

40

Bsqueda Binaria, cont.


Ejemplo: Para hallar el Dato = 40, en la lista 10,20,30,40,50,60,70,80,90


Primero se compara con el elemento del medio, 50. Puesto que Dato < 50, la bsqueda continua con la primera mitad: 10,20,30,40,50. El elemento del medio es ahora 30, que es menor que 40 (el dato buscado). La bsqueda sigue con la lista 40,50. Encontrndose el valor buscado (40) en uno de los extremos.
Clase 8

Bsqueda Binaria, cont.


Lectura de datos X(N) Inf = 1 : Sup = N Do m = (Inf+Sup)/2 If (dato < X(m))Then Sup = m Else If(dato > X(m))Then Inf = m End If Loop Until (dato=X(m) or Inf >= Sup)
Clase 8

Presentacin de resultados
If(dato=X(m)) Then
Text1.text = La posicin es: & m Text2.text = El dato es: & X(m) Else Text1.text = El dato no se encontro EndIf

43

Clase 8

Bsqueda Binaria (cont.)


Este mtodo es ms eficiente que el anterior ya que con las primeras dos comparaciones se descartan 3/4 de los datos (el 75%).
~ N: Secuencial

Comparaciones

~ Log2(N): Binaria nmero de elementos


Clase 8

TAREAS

45

Listado de ejercicios

Calcular el mayor y el menor valor de un vector. Calcular la suma y el promedio de un vector. Invertir las entradas de un vector sobre el mismo vector, ej:

[5, 6, 9, 1, 3, 0, 4] [4, 0, 3, 1, 9, 6, 5]
46

Clase 8

Listado de ejercicios

Conocidas las coordenadas de un conjunto de puntos:


Calcular un vector en la que el elemento (i) sea la distancia del punto i al origen. Calcular una matriz en la que el elemento (i,j) sea la distancia del punto i al punto j.

47

Clase 8

Listado de ejercicios

Conocido un vector:
identificar qu posicin ocupa el cuarto siete?

48

Clase 8

ANEXO 1

49

1.2.3 Mtodo de Ordenamiento Insercin

50

Mtodo de Insercin, cont.


Ejemplo: Ordenar las letras W Q R D C A B
en orden alfabtico.

1 2 3 4 5 6 7 Inicial: W Q R D C A B Paso Paso Paso Paso Paso Paso 1: 2: 3: 4: 5: 6: Q Q D C A A W R Q D C B

(posicin)

(los dos primeros se ordenan)

W R Q D C

(insertar tercero, en orden)

W R Q D

(insertar cuarto, en orden)

W (insertar quinto, en orden) R W (insertar sexto, en orden) Q R W (insertar sptimo, en


orden)
51

Clase 8

Mtodo de Insercin
1. Sostener el mazo de cartas en la mano. 2. Tomar dos cartas, colocarla en la mesa. La de menor valor antes de la de mayor valor. 3.Tomar una carta, ubicarla en la mesa, insertndola en el lugar correcto. Esto implica tener que empujar hacia adelante o hacia atrs, para efectuar la insercin correspondiente. 4. Repetir paso 3, hasta que se agoten las cartas de la mano.
52

Clase 8

Mtodo de Insercin, cont.


Programa en Visual Basic:

For i = 2 To N t = X(i) : j = i-1 Do Until(j = 0 And t >= X(j)) X(j+1) = X(j) j = j -1 Loop X(j+1) = t Next i Mtodo de Insercin tambin es ~ N2.
Clase 8
53

ANEXO 2
Subprogramas (Procedimientos):

Procedimientos Sub Procedimientos Function

54

Subprogramas

Para simplificar las tareas de programacin se dividen los programas en componentes lgicos ms pequeos. Estos componentes lgicos se denominan procedimientos o subrutinas. Los procedimientos resultan muy tiles para condensar las tareas repetitivas o compartidas, como clculos utilizados frecuentemente, manipulacin de texto y controles, operaciones con bases de datos, etc. 55
Clase 8

Subprogramas

Ya se han utilizado algunos tipos de subprogramas:


Funciones de la librera estndar de VB: Val(), Str(), Sqr(), Atn(), Abs(), etc. Otras funciones: MsgBox(), InputBox(), etc. Mtodos propios de algunos controles: Clear, AddItem, Scale, Cls, Line, Circle, etc. Procedimientos asociados a eventos: Private Sub Command1_Click() End Sub
56

Clase 8

Crear procedimientos

Un procedimiento siempre se define a nivel de mdulo (estndar o de formulario). Por lo tanto, un procedimiento no se puede anidar dentro de otro procedimiento. Todo el cdigo ejecutable de un programa en VB debe estar contenido en uno o varios procedimientos. En VB se utilizan varios tipos de procedimientos:

Procedimientos Sub que no devuelven un valor. Procedimientos Function que devuelven un valor.
Clase 8

57

Procedimientos Sub

Los procedimientos Sub no devuelven un valor. Sintaxis: Alcance Sub NombreProc(parmetros) CuerpoProcedimiento End Sub Alcance: Opcional. Es el alcance del procedimiento. Puede ser Private o Public. Si no se especifica se asume Public. NombreProc: Requerido. Es el nombre del procedimiento.
58

Clase 8

Procedimientos Sub

parmetros: Opcional. Son los parmetros del procedimiento. (Vase ms adelante). CuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento. Cada vez que se llama al procedimiento se ejecutan las instrucciones que hay entre Sub y End Sub. El cuerpo del procedimiento puede tener instrucciones Exit Sub, la cual permite salir de inmediato del procedimiento. La ejecucin del programa contina con la instruccin que sigue a la instruccin que llam el procedimiento Sub.
59

Clase 8

Procedimientos Sub

Existen dos tipos de procedimientos Sub: Procedimientos Generales y Procedimientos de Eventos. Un procedimiento de evento es un procedimiento que hace referencia a un evento de un objeto. Siempre el nombre de un procedimiento de evento se compone por el nombre del objeto, seguido de un subrayado, seguido del nombre del evento: nombreObjeto_nombreEvento Ejemplo: Command1_Click(), Form_Load(), Form_Resize() Un procedimiento general indica a la aplicacin cmo realizar una tarea especfica.
60

Clase 8

Procedimientos Function

Son procedimientos que devuelven un valor. Sintaxis: Alcance Function NombreProc(parmetros) As Tipo CuerpoProcedimiento End Function Alcance: Opcional. Es el alcance del procedimiento. Puede ser Private o Public. Si no se especifica se asume Public. NombreProc: Requerido. Es el nombre del procedimiento.
61

Clase 8

Procedimientos Function

parmetros: Opcional. Son los parmetros del procedimiento. (Vase ms adelante). CuerpoProcedimiento: Opcional. Son las instrucciones que conforman al procedimiento. Puede tener instrucciones Exit Function. Tipo: Es el tipo de dato que retorna el procedimiento. El valor que retorna un procedimiento Function se le debe asignar al nombre del procedimiento, en caso contrario se retorna el valor por defecto.
62

Clase 8

Argumentos vs Parmetros

Los argumentos pueden ser constantes, variables o expresiones pasadas a un procedimiento. Ejemplo: en la expresin: X = Sqr(15), el valor 15 corresponde al argumento pasado a la funcin Sqr de la librera estndar de VB. El parmetro es el nombre de variable por el cual un argumento de procedimiento se conoce dentro del procedimiento. Esta variable recibe el argumento que se pasa dentro del procedimiento. Su alcance es local, es decir, el alcance termina cuando el procedimiento finaliza.
63

Clase 8

Declaracin de Argumentos

Los parmetros de un procedimiento corresponde a una lista de variables (separadas por comas) que representan los argumentos que se pasan a un procedimiento cuando se le llama. La declaracin de argumentos (parmetros) de un procedimiento tiene la siguiente sintaxis:
[= valor_predeterminado]

[Optional] [ByVal | ByRef] [ParamArray] nombre_variable[( )] [As tipo]

En la sintaxis, los corchetes ([]) significan que la expresin es opcional y la barra vertical (|) significa exclusin lgica.
64

Clase 8

Declaracin de Argumentos

ByVal indica que el argumento se pasa por valor, es decir, se pasa su valor (una copia de la variable) en vez de su direccin. Como resultado, el valor actual de la variable no puede ser cambiado por el procedimiento al cual se pasa.

65

Clase 8

Declaracin de Argumentos

ByRef indica que el argumento se pasa por referencia, es decir, se pasa su direccin en vez de su valor. Como resultado, el valor real de la variable puede ser cambiado por el procedimiento al cual se pasa. ByRef es el modo predeterminado en Visual Basic.

66

Clase 8

Declaracin de Argumentos

nombre_variable es el nombre del parmetro. Los parntesis al final del nombre de la variable significan que el parmetro recibe un array. No se debe especificar tamao ni nmero de dimensiones del array, slo se colocan los parntesis vacos. tipo es el tipo de dato del parmetro. Si no se especifica se asume Variant.
67

Clase 8

Llamar procedimientos
Utilizando la instruccin Call: Call nombre_procedimiento(arg1,arg2,,argN)

En este caso, se debe utilizar parntesis despus del nombre del procedimiento. Si el procedimiento retorna un valor, este se pierde. til para procedimientos Sub. Ejemplo: Call Sqr(15)

68

Clase 8

Llamar procedimientos
En una expresin: nombre_procedimiento(arg1,arg2,,argN)

En este caso, se debe utilizar parntesis despus del nombre del procedimiento. Slo es vlido para procedimientos Function. Ejemplos:
X = Sqr(15) Y = Abs(10 * X Atn(2))

69

Clase 8

Ejemplo 1

Realizar un procedimiento genrico que permita leer una matriz por el teclado de elementos reales. Realizar un procedimiento genrico que permita mostrar una matriz de elementos reales en una caja de texto.

70

Clase 8

Ejemplo 1: Anlisis

Un procedimiento genrico para leer una matriz necesita:


Un parmetro que recibe la matriz de tipo real simple: A() As Single Un parmetro por referencia, de tipo entero, para el nmero de filas: N As Integer Un parmetro por referencia, de tipo entero, para el nmero de columnas: M As Integer
71

Clase 8

Ejemplo 1: Anlisis

Un procedimiento genrico para mostrar una matriz en una caja de texto necesita:

Un parmetro que recibe la matriz de tipo real simple: A() As Single Un parmetro por valor, de tipo entero, para el nmero de filas: ByVal N As Integer Un parmetro por valor, de tipo entero, para el nmero de columnas: ByVal M As Integer Un parmetro con la referencia de la caja de texto: txt As TextBox
72

Clase 8

Ejemplo 1: Implementacin

Procedimiento genrico para leer una matriz:

Public Sub LeerMatriz(A() As Single, N As Integer, _ M As Integer) Dim I As Integer N = Val(InputBox("Nmero de Filas:")) M = Val(InputBox("Nmero de Columnas:")) ReDim A(1 To N, 1 To M) For I = 1 To N For J = 1 To M A(I, J) = Val(InputBox("Ingrese elemento(" & _ I & ", " & J & "):")) Next J Next I End Sub

73

Clase 8

Ejemplo 1: Implementacin

Procedimiento genrico para mostrar una matriz:

Public Sub MostrarMatriz(A() As Single, ByVal N As Integer, _ ByVal M As Integer, txt As TextBox) Dim I As Integer txt.Text = "" For I = 1 To N For J = 1 To M txt.Text = txt.Text & A(I, J) & vbTab Next J txt.Text = txt.Text & vbCrLf Next I End Sub
74

Clase 8

Ejemplo 2

Realizar un procedimiento que permita multiplicar dos matrices: Una matriz A de orden mxn y una matriz B de orden pxq. Nota: Las matrices se pueden multiplicar si y slo si n = p. El orden de la matriz resultante es mxq.
75

Clase 8

Ejemplo 2: Anlisis

Un procedimiento para multiplicar dos matrices necesita:


Dos parmetros que reciben las matrices de tipo real simple: A() As Single, B() As Single Cuatro parmetros por valor, de tipo entero, para el orden de cada matriz: N1 As Integer, M1 As Integer, N2 As Integer, M2 As Integer Un parmetro que devuelve la matriz resultante: C() As Single El procedimiento devolver True si se realiz la multiplicacin, en caso contrario devolver False.
76

Clase 8

Ejemplo 2: Implementacin

Procedimiento para multiplicar dos matrices:

Public Function MultMat(A() As Single, B() As Single, _ ByVal N1 As Integer, ByVal M1 As Integer, _ ByVal N2 As Integer, ByVal M2 As Integer, _ C() As Single) As Boolean Dim I As Integer, J As Integer, K As Integer, Sum As Single If M1 <> N2 Then MultMat = False: Exit Function ReDim C(1 To N1, 1 To M2) For I = 1 To N1 For J = 1 To M2 Sum = 0 For K = 1 To M1 Sum = Sum + A(I, K) * B(K, J) Next K C(I, J) = Sum Next J Next I 77 MultMat = True Clase 8 End Function

Ejemplo 3

Realizar un programa en VB que permita, leer, multiplicar dos matrices y mostrar el resultado.

78

Clase 8

Ejemplo 3: Anlisis

Un programa que permita multiplicar dos matrices necesita:


Leer las dos matrices Realizar la multiplicacin Mostrar el resultado si la multiplicacin fue posible, en caso contrario, mostrar un mensaje descriptivo.

El programa puede hacer uso de los procedimientos definidos anteriormente, implementndolos en un mdulo estndar.
79

Clase 8

Ejemplo 3: Implementacin
'En el evento Click de un botn de Comando. Dim M1() As Single, M2() As Single, M3() As Single Dim N As Integer, M As Integer, P As Integer, Q As Integer Call LeerMatriz(M1, N, M) Call LeerMatriz(M2, P, Q) If (MultMat(M1, M2, N, M, P, Q, M3)) Then MostrarMatriz M3, UBound(M3, 1), UBound(M3, 2), Text1 Else MsgBox "No se puede multiplicar las matrices: " & _ "El nmero de columnas de la primera matriz es " & _ "diferente al nmero de filas de la segunda " & _ "matriz.", vbExclamation, "Error" End If
80

Clase 8