Vous êtes sur la page 1sur 50

Ejemplo 1

Este ejemplo ordena un array o vector usando el mtodo de ordenacin llamado Burbuja
o Bubble Sort.
Nota importante. Este algottmo no es el mas indicado para realizar ordenacin de datos,
ya que en comparacin a otros mtodos es lento. Lo que si es un mtodo fcil de
entender. ( Al final de la pgina hay enlaces para utilizar otros mtodos). Tambin
puedes mirar esta pgina donde hay una tabla que demuestra algunos conceptos a la
hora de poder elegir entre los mtodos de ordenacin mas convenientes segn la tarea
que debamos realizar: Ver pgina web
En el cdigo, se utiliza un control Listbox para cargar algunos valores no numricos y a
la vez se asignan estos a un vector. Luego al llamar a la rutina Ordenar, se ordenar en
forma alfabtica y ascendente. Por ltimo se cargan los datos ordenados en un List2.

Ejemplo

Colocar un List1

Un List2

Dos botones (Command1 y Command2 )

Cdigo en un Fom
Texto planoImprimir
1. Option Explicit
2.

3. ' -- Vector para los datos


4. Dim Vector() As Variant
5.
6. ' -------------------------------------------------------------------------------7. ' \\ -- Inicio
8. ' -------------------------------------------------------------------------------9. Private Sub Form_Load()
10.

Command1.Caption = " Ordenar Vector "

11.

Command2.Caption = " Cargar Vector "

12.

Command1.Enabled = False

13. End Sub


14.
15. ' -------------------------------------------------------------------------------16. ' \\ -- Botn para Ordenar el array y cargar los valores en el List2
17. ' -------------------------------------------------------------------------------18. Private Sub Command1_Click()
19.

Dim i As Integer

20.
21.

Call Ordenar

22.

List2.Clear

23.
24.
25.

For i = 0 To UBound(Vector)
List2.AddItem Vector(i)

26.

Next i

27.

Command1.Enabled = False

28. End Sub


29.
30. ' -------------------------------------------------------------------------------31. ' \\ -- Cargar valores en el List1
32. ' -------------------------------------------------------------------------------33. Private Sub Command2_Click()
34.

Command2.Enabled = False

35.

Command1.Enabled = True

36.
37.

Call Cargar_Array

38. End Sub


39. ' -------------------------------------------------------------------------------40. ' \\ -- BubbleSort - Sub para ordenar el vector
41. ' -------------------------------------------------------------------------------42. Private Sub Ordenar()
43.
44.

Dim iMin

As Long

45.

Dim iMax

As Long

46.

Dim Vectemp As String

47.

Dim Pos

48.

Dim i

As Long
As Long

49.
50.

iMin = LBound(Vector)

51.

iMax = UBound(Vector)

52.

' -- variable temporal

53.

While iMax > iMin

54.

Pos = iMin

55.

For i = iMin To iMax - 1

56.

If Vector(i) > Vector(i + 1) Then

57.

Vectemp = Vector(i + 1)

58.

Vector(i + 1) = Vector(i)

59.

Vector(i) = Vectemp

60.

Pos = i

61.

End If

62.

Next i

63.

iMax = Pos

64.

Wend

65. End Sub


66.
67. ' --------------------------------------------------------------------------------68. ' \\ -- Sub cargar valores de ejemplo en el array y en el control de lista
69. ' --------------------------------------------------------------------------------70. Private Sub Cargar_Array()
71.

Dim i As Integer

72.
73.

' -- Listbox

74.

With List1

75.

.AddItem "A"

76.

.AddItem "H"

77.

.AddItem "B"

78.

.AddItem "G"

79.

.AddItem "C"

80.

.AddItem "F"

81.

.AddItem "D"

82.

End With

83.
84.

' -- Array

85.

ReDim Vector(List1.ListCount - 1)

86.

For i = 0 To List1.ListCount - 1

87.
88.

Vector(i) = List1.List(i)
Next i

89. End Sub


Option
Explicit
' -- Vector para los datos
Dim Vector() As Variant
'
--------------------------------------------------------------'
\\ -- Inicio

Ejemplo 2
Proyecto enviado por Juan Paz, similar al visto anteriormente, donde primeramente se
cargan en forma aleatoria unos nmeros en un array y al mismo tiempo en un listbox
( el de la izquierda ).
Luego para ordenar se llama a la rutina Bubble sort , enviando como argumento el
vector anterior para ordenarlo.
Descargar proyecto vb

Ejemplo del algortmo llamado insercin para ordenar un


array de nmeros

Este mtodo ordena el vector desplazando los elementos mayores hacia la parte derecha
y los inferiores hacia la izquierda

La sub que ordena el array, se le debe enviar como parmetro la matriz a ordenar y en el
segundo parmetro el modo de ordenacin , es decir en forma Ascendente o
Descendente.
Nota: para optimizar la velocidad de ordenacin, sobre todo si son muchos elementos,
cambiar la declaracin del vector ( que est como Variant ), al tipo de dato a usar. Y
tambin el valor de la variable t as Variant ( El elemento temporal ) que se encuentra
dentro del procedimiento de ordenacin
Otra cuestin es que este mtodo es mucho mas eficiente cuando el vector ha sido
inicializado con los datos ordenados en forma Ascendente, no asi cuando se ha
inicializado en forma aleatoria o en forma Descendente.

Colocar:

un control ListBox

y dos CommandButton, el Command1 llena el vector de nmeros


aleatorios, el Command2 los ordena

Cdigo fuente en el formulario


Texto planoImprimir
1. Option Explicit
2.
3. Enum E_ORDEN
4.

Ascendente = 1

5.

Descendente = 0

6. End Enum
7.
8. Dim un_Vector(1 To 1000) As Variant
9.
10.Sub Insercion(El_Vector() As Variant, ORDEN As E_ORDEN)
11.

12.Dim i As Long
13.Dim t As Variant
14.Dim Actual As Long
15.Dim Min As Long
16.Dim Max As Long
17.
18.Min = LBound(El_Vector)
19.Max = UBound(El_Vector)
20.
21.Actual = Min + 1
22.While Actual <= Max
23.

i = Actual

24.

Do

25.
26.
27.

If i > Min Then


If ORDEN = Ascendente Then
If El_Vector(i) < El_Vector(i - 1) Then

28.

t = El_Vector(i)

29.

El_Vector(i) = El_Vector(i - 1)

30.

El_Vector(i - 1) = t

31.

i=i-1

32.

Else

33.
34.
35.
36.
37.

Exit Do
End If
Else
If El_Vector(i) >= El_Vector(i - 1) Then
t = El_Vector(i)

38.

El_Vector(i) = El_Vector(i - 1)

39.

El_Vector(i - 1) = t

40.

i=i-1

41.

Else

42.

Exit Do

43.

End If

44.
45.

End If
Else

46.
47.

Exit Do
End If

48.
49.

Loop

50.

Actual = Actual + 1

51.Wend
52.
53.End Sub
54.
55.Private Sub Command1_Click()
56.Dim i As Long
57.
58.

Randomize

59.

'Algunos valores aleatorios para el vector

60.

For i = LBound(un_Vector) To UBound(un_Vector)

61.
62.
63.

un_Vector(i) = Round(Rnd * 10000)


Next

64.

Call Cargar_ListBox(un_Vector)

65.
66.

Command1.Enabled = Not Command1.Enabled

67.

Command2.Enabled = Not Command2.Enabled

68.
69.End Sub
70.
71.Private Sub Command2_Click()
72.

'Le pasa el vector para ordenarlo

73.

Call Insercion(un_Vector, Ascendente)

74.
75.

' carga los valores ordenados en el listbox

76.

Call Cargar_ListBox(un_Vector)

77.
78.

Command1.Enabled = Not Command1.Enabled

79.

Command2.Enabled = Not Command2.Enabled

80.
81.End Sub
82.
83.Private Sub Cargar_ListBox(un_Vector)
84.
85.

Dim i As Long

86.

List1.Clear

87.

For i = LBound(un_Vector) To UBound(un_Vector)

88.
89.

List1.AddItem un_Vector(i)

90.
91.

Next

92.
93.End Sub
94.
95.Private Sub Form_Load()
96.Command1.Caption = " Cargar aleatorios "
97.Command2.Caption = " Ordenar vector "
98.Command2.Enabled = False
99.End Sub
100.
101.

Private Sub Form_Resize()

102.

Command1.Width = 2500

103.

Command2.Width = 2500

104.
105.
106.
List1.Move 0, 0, Me.ScaleWidth, Me.ScaleHeight - Command1.H
eight
107.
108.
Command2.Move Me.ScaleWidth - (Command2.Width + 50), Lis
t1.Top + List1.Height + 50
109.
Command1.Move Command2.Left - (Command2.Width + 50), Li
st1.Top + List1.Height + 50
110.
111.

End Sub

Option
Explicit
Enum E_ORDEN
Ascendente = 1
Descendente = 0
End Enum
Dim un_Vector(1 To 1000) As Variant

Ejemplo que llena un vector con valores numricos


aleatorios, y luego los ordena visualizandolos en un
ListBox con el mtodo QuickSort

Este mtodo, por las pruebas que he hecho comparndolo con el mtodo burbuja
(bubble sort ) y otros, para ordenar un vector o array que contiene los datos
desordenados, es el mas rpido.

El ejemplo tiene una funcin llamada Ordenar_Matriz con los siguientes parmetros:

Sub Ordenar_Matriz(El_Vector() As Variant, _


Limite_Inferior As Long, _
Limite_Superior As Long)

El primer parmetro de la rutina se debe enviar el vector a ordenar.


El segundo es el lmite inferior: Lbound(El_Vector)
El tercero es el lmite Superior: Ubound(El_Vector)

Colocar dos Commandbutton. El Command1 crea valores aleatorios y los carga en el


array y en un Listbox.
El Command2 ordena la matriz y luego carga los datos ordenados en el control.

Nota: el vector est declarado como Variant para que se pueda enviar cualquier dato
numrico. Por eso para utilizarlo con algn dato especifico y optimizar, por ejemplo
datos de tipo Long, single etc.., declararlo como " tal " en el argumento de la funcin.

Cdigo fuente en el formulario:


Texto planoImprimir
1. Option Explicit
2.
3.
4. 'Vector que se va a desordenar y ordenar
5. Dim Vector() As Variant
6.
7.
8. Sub Ordenar_Matriz(El_Vector() As Variant, _
9.

Limite_Inferior As Long, _

10.

Limite_Superior As Long)

11.

12.Dim i As Long, j As Long, x As Variant, y As Variant


13.
14.i = Limite_Inferior
15.j = Limite_Superior
16.
17.x = El_Vector((Limite_Inferior + Limite_Superior) / 2)
18.
19.While i <= j
20.
21.
22.
23.

While (El_Vector(i) < x) And (i < Limite_Superior)


i=i+1
Wend

24.
25.
26.
27.

While (x < El_Vector(j)) And (j > Limite_Inferior)


j=j-1
Wend

28.
29.

If i <= j Then

30.

y = El_Vector(i)

31.

El_Vector(i) = El_Vector(j)

32.

El_Vector(j) = y

33.

i=i+1

34.

j=j-1

35.

End If

36.
37.Wend

38.
39.If Limite_Inferior < j Then Ordenar_Matriz El_Vector(), Limite_Inferior, j
40.If i < Limite_Superior Then Ordenar_Matriz El_Vector(), i, Limite_Super
ior
41.
42.End Sub
43.
44.'carga valores aleatorios en el vector
45.Private Sub Command1_Click()
46.

Dim i As Integer

47.

Randomize

48.

List1.Clear

49.
50.

ReDim Vector(100)

51.
52.

For i = 0 To 100

53.

List1.AddItem Round(Rnd * 5000)

54.

' Llena el array con los nmeros

55.

Vector(i) = Round(Rnd * 5000)

56.

Next

57.
58.

Command1.Enabled = False

59.

Command2.Enabled = True

60.End Sub
61.
62.'Ordena la matriz y luego de ordenada los carga en el ListBox

63.Private Sub Command2_Click()


64.

Dim i As Integer

65.

List1.Clear

66.
67.

'Pasar el vector, y los lmites inferior y superior del mismo

68.

Call Ordenar_Matriz(Vector, LBound(Vector), UBound(Vector))

69.
70.

'Agrega el vector ordenado al ListBox

71.

For i = LBound(Vector) To UBound(Vector)

72.
73.

List1.AddItem Vector(i)
Next

74.
75.

Command1.Enabled = True

76.

Command2.Enabled = False

77.
78.End Sub
79.
80.
81.Private Sub Form_Load()
82.Command1.Caption = " Cargar Listbox con aleatorios "
83.Command2.Caption = " Ordenar Vector y cargarlo en ListBox "
84.Command2.Enabled = False
85.End Sub

1 - QuickSort
Este ejemplo ordena un vector o array que se llena con nmeros aleatorios. Esos
nmeros se visualizan en un control ListBox. Luego para ordenarlos se llama a una
funcin llamada Ordenar. A esta funcin se le pasa el vector como parmetro. Por
ltimo, una ves devuelto el vector ordenado, se recorre el mismo en un For-next y se
agregan en un segundo ListBox

Colocar los siguiente controles como estn en la imagen:

Un control text1 que ser la cantidad de elementos del vector a ordenar.

2 controles ListBox, El list1 carga el vector desordenado con lo nmeros


aleatorios. El List2 visualiza el resultado del vector ordenado

Dos CommandButton. El command1 Llena el vector con nmeros aleatorios, el


Command2 Ordena el vector.

Cdigo en un mdulo bas:

Dim
vecMenor() As Long, vecMayor() As Long
Dim a, sl, pRight, pLeft, iEnd, Max, star, pos As Long
Public Sub ordenar2(elVector() As Long)
If Not entre Then
pLeft = star
pRight = iEnd

Cdigo fuente en el formulario:


'Dim vector a ordenar
Dim UnVector() As Long

Private Sub Command1_Click()


Dim x As Long, i As Integer
List1.Clear
List2.Clear

2 - Mdulo bas con 5 rutinas de


ordenamiento
Mdulo enviado por Luis Nuez
Este bas contiene cinco funciones de ordenamiento de datos , incluyendo el algoritmo
QuickSort, BubbleSort y de Seleccin

Descargar mdulo Sort.bas

3 - Ordenar archivos
Este ejemplo utiliza el mtodo de ordenacin QuickSort para ordenar un array que
contiene cargado una lista de archivos. La ordenacin se realiza de acuerdo al tamao
de los archivos en modo ascendente. El resultado se visualiza en un control TextBox
Colocar en un formulario :

Una caja de texto : txtResult ( Colocar la propiedad Multilinea en True )

Un botn : cmdSort

Vista previa del Form

Cdigo fuente
Texto planoImprimir
1. Option Explicit
2.
3. ' --------------------------------------------------------------------------------------4. ' \\ -- Autor del ejemplo : Luciano Lodola -- http://www.recursosvisualbasic.com
.ar
5. ' \\ -- Nota. La funcin de ordenacin est adaptada de un ejemplo creado por Ra
ndy Birch)
6. ' --------------------------------------------------------------------------------------7.

8. ' -- UDT para los datos


9. Private Type tData
10.

sFileName

11.

curFileSize
n bytes)

As String
As Currency

' -- Campo para el Nombre del archivo


' -- Campo para el tamao ( expresado e

12. End Type


13.
14. ' -- Declarar matriz de datos ( almacenar una lista de archivos)
15. Private the_array()

As tData

16.
17. ' --------------------------------------------------------------------------------------18. ' \\ -- Funcin para ordenar el array de acuerdo al campo numrico del UDT
19. ' -- Recibe el array, y el ndice bajo y alto
20. ' --------------------------------------------------------------------------------------21. Private Sub QuickSort(the_array() As tData, l As Currency, r As Currency)
22.
23.

Dim i

As Currency

24.

Dim j

As Currency

25.

Dim X

As Currency

26.

Dim Y

As tData

27.
28.

i=l

29.

j=r

30.

X = the_array((l + r) / 2).curFileSize

31.
32.

While (i <= j)

33.

While (the_array(i).curFileSize < X And i < r)

34.
35.
36.
37.
38.

i=i+1
Wend
While (X < the_array(j).curFileSize And j > l)
j=j-1
Wend

39.
40.

If (i <= j) Then

41.
42.

Y.curFileSize = the_array(i).curFileSize

43.

Y.sFileName = the_array(i).sFileName

44.
45.

the_array(i).curFileSize = the_array(j).curFileSize

46.

the_array(i).sFileName = the_array(j).sFileName

47.
48.

the_array(j).curFileSize = Y.curFileSize

49.

the_array(j).sFileName = Y.sFileName

50.
51.

i=i+1

52.

j=j-1

53.
54.

End If
Wend

55.
56.
57.

If (l < j) Then
Call QuickSort(the_array, l, j)

58.

End If

59.
60.
61.
62.

If (i < r) Then
Call QuickSort(the_array, i, r)
End If

63.
64. End Sub
65.
66. ' ----------------------------------------------------------------------------------------67. ' \\ -- Botn para ordenar el array
68. ' ----------------------------------------------------------------------------------------69. Private Sub cmdSort_Click()
70.
71.

Dim sPath As String

72.
73.

' -- Abrir inputbox para el directorio

74.

sPath = InputBox("Escribir un directorio vlido", , Environ("windir"))

75.

If Len(sPath) = 0 Then Exit Sub

76.
77.

' -- Cargar array ( por defecto enviar el directorio de windows )

78.

Call Fill_Array(sPath)

79.
80.

' -- Llamar a la funcin para ordenar con QuickSort

81.

Call QuickSort( _

82.

the_array, _

83.

LBound(the_array), _

84.

UBound(the_array))

85.
86.

' -- Mostrar ahora el array en listbox, con los datos ordenados por el campo ( "
Tamao de archivo")

87.

Dim i As Long

88.
89.

For i = LBound(the_array) To UBound(the_array)

90.
91.

'lstFiles.AddItem the_array(i).sFileName
txtResult.Text = txtResult.Text & the_array(i).sFileName & " -- " & the_arr
ay(i).curFileSize & " bytes" & vbNewLine

92.
93.

txtResult.SelStart = Len(txtResult)
Next

94.
95. End Sub
96.
97. ' ----------------------------------------------------------------------------------------98. ' \\ -- Inicio -- Cargar lista de archivos en el array
99. ' ----------------------------------------------------------------------------------------100.

Private Sub Fill_Array(sPath As String)

101.
102.

Dim sFileName As String

103.

Dim lIndex

As Long

104.
105.

' -- Comprobar la barra separadora del path

106.

If Right(sPath, 1) <> "\" Then sPath = sPath & "\"

107.

' -- Buscar el primer archivo del directorio windows

108.
sFileName = Dir(sPath & "*.*", vbArchive + vbHidden + vbNormal +
vbReadOnly + vbSystem)
109.
' -- Redimensionar el array que contendr la lista de archivos a buscar e
n windows
110.

ReDim the_array(0)

111.
112.

' -- Cambiar puntero de espera del mouse

113.

Me.MousePointer = vbHourglass

114.
115.

' -- Buscar ...

116.

While sFileName <> ""

117.

' -- ndice del ltimo elemento de la matriz

118.

lIndex = UBound(the_array)

119.

' -- Cargar los datos en array ( Tamao y nombre)

120.

With the_array(lIndex)

121.

.curFileSize = FileLen(sPath & sFileName)

122.

.sFileName = sFileName

123.

End With

124.

' -- redimensionar la matriz para el prximo elemento

125.

ReDim Preserve the_array(lIndex + 1)

126.

' -- Seguir buscando mas archivos

127.

sFileName = Dir

128.

Wend

129.
' -- Si hay mas de un archivo, entonces eliminar el ltimo ya que es un
elemento vaco
130.

If UBound(the_array) > 0 Then

131.
132.

ReDim Preserve the_array(UBound(the_array) - 1)


End If

133.
134.

' -- Fin

135.

Me.MousePointer = vbDefault

136.

Exit Sub

137.

error_handler:

138.

MsgBox Err.Description, vbCritical

139.

Me.MousePointer = vbDefault

140.

End Sub

141.
142.
143.
144.

Private Sub Form_Load()


cmdSort.Caption = "Cargar y Ordenar"
End Sub

Option
Explicit
'
--------------------------------------------------------------'
\\ -- Autor del ejemplo : Luciano Lodola -http://w w w .recursosvisualbasic.com.ar
' \\ -- Nota. La funcin de ordenacin est adaptada
creado por Randy Birch)

Ordenar registros de un archivo de texto


El siguiente ejemplo es similar al anterior, y lo que hace es leer un archivo de texto que
contiene registros ( un CVS delimitado por comas ). Este contiene dos campos :
Nombre de producto y Precio de producto.

Luego de leer los registros que se encuentran desordenados, se cargan todos ellos en un
vector para poder ordenarlos con QuickSort de acuerdo al campo Precio. Por ltimo,
una vez finalizada la ordenacin, se cargan los registros en un grid

Ejemplo
1 - Colocar un control Microsoft FlexGrid : MsFlexGrid1
2 - Botn : CmdSort
3 - Crear un archivo en al App.path llamado test.txt con dos campos ( Producto y
precio )
El archivo contiene la siguiente estructura ( delimitado por el caracter punto y coma )
por ejemplo
Producto 1;130,65
Producto 2;76,85
Producto 3;16,35
Producto 4;98,28
Producto 5;1000,22
Producto 6;14,45
Producto 7;154,25
Producto 8;163,15
Producto 9;18,75
Producto 10;123,95
Producto 11;1,20
Producto 12;3,35
Producto 13;3,65
Producto 14;33,28
Producto 15;93,23

Cdigo fuente
Texto planoImprimir
1. Option Explicit
2.
3. ' --------------------------------------------------------------------------------------4. ' \\ -- Autor del ejemplo : Luciano Lodola -- http://www.recursosvisualbasic.com
.ar
5. ' \\ -- Nota. La funcin de ordenacin est adaptada de un ejemplo creado por Ra
ndy Birch)
6. ' --------------------------------------------------------------------------------------7.
8. ' -- UDT para los datos
9. Private Type tData
10.

s_Nombre_Producto
producto

11.

cur_Precio_Producto
roducto

As String
As Currency

' -- Campo para el Nombre del


' -- Campo para el precio del p

12. End Type


13.
14. ' -- Declarar matriz de datos para almacenar los registros del archivo
15. Private the_array()

As tData

16.
17. ' --------------------------------------------------------------------------------------18. ' \\ -- Funcin para ordenar los registros de acuerdo al precio de cada producto
19. ' --------------------------------------------------------------------------------------20. Private Sub QuickSort(the_array() As tData, l As Currency, r As Currency)
21.

22.

Dim i

As Currency

23.

Dim j

As Currency

24.

Dim X

As Currency

25.

Dim Y

As tData

26.
27.

i=l

28.

j=r

29.

X = the_array((l + r) / 2).cur_Precio_Producto

30.
31.
32.
33.
34.
35.
36.
37.

While (i <= j)
While (the_array(i).cur_Precio_Producto < X And i < r)
i=i+1
Wend
While (X < the_array(j).cur_Precio_Producto And j > l)
j=j-1
Wend

38.
39.

If (i <= j) Then

40.
41.

Y.cur_Precio_Producto = the_array(i).cur_Precio_Producto

42.

Y.s_Nombre_Producto = the_array(i).s_Nombre_Producto

43.
44.

the_array(i).cur_Precio_Producto = the_array(j).cur_Precio_Producto

45.

the_array(i).s_Nombre_Producto = the_array(j).s_Nombre_Producto

46.

47.

the_array(j).cur_Precio_Producto = Y.cur_Precio_Producto

48.

the_array(j).s_Nombre_Producto = Y.s_Nombre_Producto

49.
50.

i=i+1

51.

j=j-1

52.
53.

End If
Wend

54.
55.
56.
57.

If (l < j) Then
Call QuickSort(the_array, l, j)
End If

58.
59.
60.
61.

If (i < r) Then
Call QuickSort(the_array, i, r)
End If

62.
63. End Sub
64.
65. ' ----------------------------------------------------------------------------------------66. ' \\ -- Botn para comenzar la ordenacin
67. ' ----------------------------------------------------------------------------------------68. Private Sub cmdSort_Click()
69.
70.

' -- Cargar los registros del archivo en el array

71.

If Fill_Array(App.Path & "\test.txt") Then

72.

' -- Llamar a la funcin para ordenar con QuickSort

73.

Call QuickSort(the_array, LBound(the_array), UBound(the_array))

74.
75.

' -- Cargar los datos ordenados en el Grid ( Microsoft Flexgrid )

76.

Dim i As Variant

77.

With MSFlexGrid1

78.

Call pvConfig_FlexGrid

79.

For i = LBound(the_array) To UBound(the_array)

80.

' -- Agregar producto y precio ordenados en forma ascendente

81.

.AddItem _

82.

CStr(the_array(i).s_Nombre_Producto) & vbTab & _

83.

FormatCurrency(the_array(i).cur_Precio_Producto)

84.

Next

85.

End With

86.

End If

87.
88. End Sub
89.
90. ' ----------------------------------------------------------------------------------------91. ' \\ Leer los registros del archivo y cargarlos en la matriz para poder ordenarlos
92. ' ----------------------------------------------------------------------------------------93. Private Function Fill_Array(sFileName As String) As Boolean
94.
95.
96.

On Error GoTo error_handler

97.

Dim nFileNumber

98.

Dim lIndex

As Long

99.

Dim sLine

As String

100.

Dim arrLine()

As Integer

As String

101.
102.

' -- Buscar un nmero de archivo libre

103.

nFileNumber = FreeFile

104.
105.

Open sFileName For Input As #nFileNumber

106.
107.
' -- Redimensionar el array que contendr la lista de archivos a buscar e
n windows
108.

ReDim the_array(0)

109.
110.

' -- Cambiar puntero de espera del mouse

111.

Me.MousePointer = vbHourglass

112.
113.

' -- Buscar ...

114.

While Not EOF(nFileNumber)

115.

' -- ndice del ltimo elemento de la matriz

116.

lIndex = UBound(the_array)

117.
118.

Line Input #nFileNumber, sLine

119.
120.
121.

arrLine = Split(sLine, ";")

122.

' -- Cargar los datos en array ( Tamao y nombre)

123.

With the_array(lIndex)

124.

.cur_Precio_Producto = CCur(arrLine(1))

125.

.s_Nombre_Producto = arrLine(0)

126.

End With

127.

' -- redimensionar la matriz para el prximo elemento

128.

ReDim Preserve the_array(lIndex + 1)

129.

Wend

130.
131.

' -- Cerrar el archivo

132.

Close #nFileNumber

133.
134.
' -- Si hay mas de un archivo, entonces eliminar el ltimo ya que es un
elemento vaco
135.
136.

If UBound(the_array) > 0 Then


ReDim Preserve the_array(UBound(the_array) - 1)

137.

End If

138.

Fill_Array = True

139.
140.

' -- Fin

141.

Me.MousePointer = vbDefault

142.

Exit Function

143.

error_handler:

144.

MsgBox Err.Description, vbCritical

145.

Me.MousePointer = vbDefault

146.

Close

147.

End Function

148.
--

' ---------------------------------------------------------------------------------------

149.

' \\ Configurar opciones del Grid

150.
--

' ---------------------------------------------------------------------------------------

151.

Private Sub pvConfig_FlexGrid()

152.

' -- Configurar encabezado del Grid

153.

With MSFlexGrid1

154.

.Clear ' -- Borrar datos previos del Grid

155.

.FixedCols = 0

156.

.FormatString = "NombreProducto|Precio del Producto"

157.

' -- Ancho de las columnas

158.

.ColWidth(0) = 3500

159.

.ColWidth(1) = 2500

160.

.Rows = 1

161.
162.

End With
End Sub

163.
164.

Private Sub Form_Load()

165.

Call pvConfig_FlexGrid

166.

cmdSort.Caption = "Cargar y Ordenar"

167.

End Sub

Ejemplo programado y enviado a la web por: Carlos A.


Bertoni . El ejemplo ordena nmeros, y est basado en el
mtodo de ordenacin " Shell - Metzner "

El mismo muestra como ordenar un vector que contiene nmeros aleatorios cargados en
un RichTextBox, y luego de ordenados visualizar el resultado en otro RichText.
El mtodo es muy rpido, y es parecido al mtodo QuickSort

Para el ejemplo colocar los siguiente controles como muestra el grfico:

El control TextBox para ingresar la cantidad de elementos a ordenar se debe llamar:


t_elem
El CommandButton que dice calcular nmeros ( llena con nmeros aleatorios ) -->
Command1
El CommandButton para ordenar -> Command2
Colocar dos controles RichTextBox llamados rt1 y rt1. (obviamente se puede utilizar
otros controles como por ejemplo textbox )
Por ltimo agregar en el orden del grfico los controles textBox para ver los tiempos y
algunos detalles:
El text para Hora de inicio ->> como nombre L_horai
El text Hora fin ->> L_horaf

Para el tiempo estimado ->> L_tiempo


y para ver los cambios realizados ->> T_cambios
Cdigo fuente en el formulario
Texto planoImprimir
1. Option Explicit
2.
3.
4. Dim vector()

'vector a ordenar

5. Dim nElem As Long

'Cantidad de elementos a ordenar

6. Dim eTempo As Variant

'variable temporal

7. Dim Cambios As Long

'Cantidad de cambios hechos

8. Dim Puntero As Long

'Elemeto que fluctua en el array

9. Dim ESupe
10.Dim EInfe

'Elemento superior
'Elemento inferior

11.Dim Elemento As Long

'Numero de elemento seleccionado

12.Dim SText As String


13.
14.Private Sub Command1_Click()
15.

Dim r As Long

16.

Dim SText As String

17.

'Cargo la cantidad de elementos

18.

nElem = Val(t_elem)

19.
20.

rt1.Text = vbNullString

21.
22.

Erase vector

23.

ReDim vector(nElem)

24.
25.

Randomize

26.

For r = 1 To nElem

27.

vector(r) = Int(nElem * Rnd)

28.

SText = SText & vector(r) & " "

29.

Next

30.

rt1.Text = SText

31.

Command2.Enabled = True

32.

rt2.Enabled = True

33.
34.End Sub
35.
36.Private Sub Command2_Click()
37.

Dim r As Long, tiempo1 As Date, tiempo2 As Date

38.
39.

tiempo1 = Format(Time$, "hh:mm:ss")

40.

L_horai.Caption = tiempo1

41.
42.
43.

rt2.Text = vbNullString

44.
45.

'Setear el puntero en la mitad de los elementos del array.

46.

Puntero = nElem \ 2

47.
48.

'Ciclar hasta que el pivote sea 0.

49.

Do While Puntero > 0

50.
51.

'Doy valor al elemento superior hasta donde se va a leer

52.

ESupe = nElem - Puntero

53.
54.

'Ciclo hasta llegar al elemento inferior

55.

Do

56.
57.

'Doy valor 0 al elemento inferior

58.

EInfe = 0

59.
60.

'Voy desde el primer elemeto al elemento superior

61.

For Elemento = 1 To ESupe

62.
63.

'Comparo cual es el elemento mas chico

64.

If vector(Elemento) > vector(Elemento + Puntero) Then

65.

'Hago el cambio

66.

eTempo = vector(Elemento + Puntero)

67.

vector(Elemento + Puntero) = vector(Elemento)

68.

vector(Elemento) = eTempo

69.

'Calculo la cantidad de cambios

70.

Cambios = Cambios + 1

71.

'el Elemento inferior toma el valor

72.

'del ultimo elemento cambiado

73.

EInfe = Elemento

74.

End If

75.

Next Elemento

76.
77.

'El elemento superior es igual al elemento

78.

'inferior menos el puntero

79.

ESupe = EInfe - Puntero

80.

Loop While EInfe

81.
82.

'Vuelvo a dividir el puntero

83.

Puntero = Puntero \ 2

84.

Loop

85.
86.

tiempo2 = Format(Time$, "hh:mm:ss")

87.

L_horaf.Caption = tiempo2

88.

L_tiempo.Caption = Format(tiempo1 - tiempo2, "hh:mm:ss")

89.

T_cambios.Text = Cambios

90.
91.
92.
93.

For r = 1 To nElem
SText = SText & vector(r) & " "
Next

94.
95.

'Muestra los datos

96.

rt2.Text = SText

97.
98.End Sub
99.
100.

Private Sub Form_Load()

101.
102.

Me.Caption = " Mtodo para ordenar nmeros "

103.

Command1.Caption = " Calcular nmeros a ordenar "

104.

Command2.Caption = " Ordenar "

105.

Command2.Enabled = False

106.

rt2.Enabled = False

107.
108.

End Sub

texto con efectos

Este blog
Acceso desde aqu

Internet
Este blog

Acceso desde aqu

Internet

martes 13 de octubre de 2009


Metodo de la Burbuja
Cuando estamos trabajando con mucha informacin, es imposible encontrar
lo que ando buscando si no est ordenado. Imagnate tu directorio telefnico
si no estuviera ordenado alfabticamente probablemente jams lo usaras.
Esto sucede con los sistemas informticos tambin: no basta guardar todos
los datos, hace falta mantenerlos en orden o poder ordenarlos.
Ahorita voy a explicar una manera de ordenar datos. Es el algoritmo menos
eficiente, pero el ms fcil de entender. Este algoritmo es el de Burbuja (o
bubble sort) y lo voy a ilustrar usando arreglos. Una vez que entiendas como
funciona con arreglos, no tendrs problemas en implementarlo con
diferentes tipos de estructuras, clases, registros, etc. Voy a hacer el cdigo
usando Visual Basic 6.0 (que va a ser igual que el 2005) y en C. Con esto
creo que no tienen problema en transportar el cdigo a cualquier lenguaje
de programacin.
El algoritmo funciona de la siguiente manera: primero compara el primer
elemento contra los dems (obviamente se va comparando uno por uno,
elemento por elemento). Si se encuentra un elemento menor, intercambia el
contenido (es decir, asigna a este elemento el valor menor y el valor que
tena lo deja en el elemento donde estaba el valor ms pequeo). Una vez
terminado de comparar el primer elemento contra todos los dems (se
supone que el elemento menor est en la primera posicin), hago lo mismo

con el siguiente elemento: lo comparo con todos los que siguen y dejo el
menor valor (de los que quedan) , y as sucesivamente voy comparando
todos los elementos contra todos. Al final del da, debera tener un arreglo
ordenado.
Por si te hice bolas, s que una imagen vale mil palabras y como no pienso
escribir mil palabras, mejor hice unos dibujitos para aclarar la situacin.
Espero que se entienda. Despus de la imagen, hacemos el algoritmo en C y
Visual Basic. Ah va la manera en que ordeno el primer elemento...

Ok. All est el primer elemento. Ahora voy con el segundo elemento...

Ahora voy con el tercero...

As me voy ordenando todos, pero para completar el ejercicio, ah va la


manera en que se ordena el cuarto elemento:

Y el quinto...

Y el sexto...

El sptimo y octavo...

Ya no tiene comparar el octavo con el noveno porque se supone que si todos


los nmero estn ordenados hasta el octavo elemento, el ltimo debe ser el
mayor a todos. El arreglo final, ordenadito y toda la cosa, es as:

Listo! Queda un arreglo ordenadito y toda la cosa. Este algoritmo es muy


sencillo de entender, sin embargo, es muy ineficiente. La eficiencia de un
algoritmo tiene que ver directamente con el nmero de comparaciones que
tiene que hacer y este algoritmo es muy ineficiente porque hace
muchsimas.
Ahora, ya entendido el concepto y la manera en que funciona este
algoritmo, vamos a mostrar cmo se vera ya en cdigo. Como el lenguaje C
es muy simple, primero lo voy a resolver en este lenguaje. Aqu pongo el
cdigo y abajo de esta imagen explico que onda.

Le puse comentarios al cdigo con la esperanza que se entienda mejor. De


este cdigo, lo interesante, lo que hace el trabajo, son los dos ciclos
anidados. El ciclo de "i" se encarga de dejarnos visitar todos los elementos
del arreglo y el ciclo "j" nos permite comparar todos los elementos que son
mayores de i (o sea, los que faltan por comparar). Si el elemento en la
posicin j es menor al que est en la posicin i, los intercambio (para esto
uso una variable k que auxilia en la cambiadera).
Simplemente como comentario cultural, el cdigo en C lo hice usando el
compilador Microsoft Visual C++ 6.0, pero como us el C estndar (ANSI C)
debera funcionar con cualquier compilador (bueno, algunos comentarios
estn en "formato" C++, los que comienzan con dos diagonales invertidas,
pero no creo que tengas broncas).
Al ejecutarlo se ve as:

Transportar esta idea a Visual Basic 6.0 es sencillo (y es an ms fcil usar


el cdigo de Visual Basic 6 en el 2005). Hice una pequea aplicacin,
sencillita, que tiene 10 cajas de texto y dos botones. Un botn ordena los
valores de las cajas de texto y el otro finaliza la ejecucin del programa. El
interfaz se ve as:

El cdigo del programa es sta:

En ste cdigo, txtNumero es un arreglo de los TextBoxes que estn en la


pantalla. Algn problema? Recuerda que si te quedaste con dudas, me
puedes dejar un comentario e intentar responderte en cuanto pueda.
Ahora voy a hacer esta misma aplicacin en Visual Basic 2005. Es casi igual
que en la versin 6, pero de todos modos les muestro la interfaz y luego el
cdigo. El gran problema que me trauma de la versin 2005 es que no es
posible tener arreglos de controles. Bueno, s se puede pero es un gran
relajo al que prefiero no entrarle. Para saltarme esta bronca, antes de
ordenar, copio los valores de las cajas de texto (txtNumero1 a txtNumero10)

a un arreglo.

Y aqu les dejo el cdigo de la ventana es sta: