Que onda a todos.
De nuevo he estado con muchos trabajos, tareas, y demás cosas y por lo mismo no he podido publicar muchas cosas... espero y ya lleguen las vacaciones para poder mejorar el servicio del blog
Bueno pues hoy publico esta tarea que me acaban de dejar y que ya había visto antes en Pascal jaja pero me da flojera publicar el código en pascal, y pues mejor lo publico en Visual Basic .net pero pues si alguien desea el código en Pascal, solo pídanlo y lo pongo :p
Bueno este es otro método de selección también de los mas utilizados para enseñar métodos de ordenamiento, pero por lo mismo que es muy fácil, no es muy práctico usarlo cuando uno desea ordenar datos a gran escala. Para eso mejor utiliza el Quick Sort, pero ese lo publicaré a ver si el martes ya que me dejen la tarea jaja ya que por ahorita tengo otras cosas que hacer
Bueno veamos como funciona el algoritmo de Selección:
- Necesitamos recorrer cada uno de los elementos del vector (si tenemos 10 elementos, nuestro ciclo girará 10 veces) y por cada vuelta necesitamos hacer lo siguiente:
- Buscamos el menor numero, comenzando en la posición actual del ciclo exterior + 1 hasta terminar el vector.
- Una vez que encontramos el numero menor, lo intercambiamos con el numero que este dentro del vector en la posición de la vuelta externa (es decir, que si por ejemplo es la vuelta #3, entonces intercambiaremos vector[3] por la variable "minimo" )
- Si no se encontró un numero menor, entonces no sucede nada
- Hacemos esto hasta que el ciclo externo recorra todas las posiciones del vector
Y bueno aquí esta una imagen para que te des idea visual de como funciona:

Y también te dejo el algoritmo "codificado" para que veas más o menos lo que necesitas hacer:
<strong>para</strong> i=1 <strong>hasta</strong> n-1
minimo = i;
<strong>para</strong> j=i+1 <strong>hasta</strong> n
<strong>si</strong> lista[j] < lista[minimo] <strong>entonces</strong>
minimo = j <strong>/* (!) */</strong>
<strong>fin si</strong>
<strong>fin para</strong>
intercambiar(lista[i], lista[minimo])
<strong>fin para</strong>
Esta es una imagen de como queda este método en Visual Basic .Net:

y he aquí el código:
-
Public Class Form1
-
-
Private Function getMilisegundos(ByVal fecha As Date) As Long
-
Dim respuesta As Long = 0
-
Dim dteFechaAux As Date = New Date(1970, 1, 1, 0, 0, 0, 0)
-
respuesta = DateDiff(DateInterval.Second, dteFechaAux, fecha) * 1000 + fecha.Millisecond
-
Return respuesta
-
End Function
-
-
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
-
Dim vec1(1999) As Integer
-
Dim rand As New Random
-
Dim a, b, min, Nmin, comp1 As Integer
-
Dim str1 As String
-
Dim tim1I As Long = 0
-
Dim tim1F As Long = 0
-
-
'llenamos el primer vector de numeros aleatorios
-
For a = 0 To vec1.Length - 1
-
vec1(a) = rand.Next(0, 101)
-
Next
-
-
'ordenamos primer vector con metodo de Selección y contamos el tiempo trancurrido y total de intercambios
-
comp1 = 0
-
tim1I = getMilisegundos(DateTime.Now)
-
Nmin = -1
-
For a = 0 To vec1.Length - 2
-
min = vec1(a)
-
For b = a + 1 To vec1.Length - 1
-
comp1 += 1 'incrementamos el contador de comparaciones
-
-
If vec1(b) <min Then
-
Nmin = b
-
min = vec1(b)
-
End If
-
Next
-
If Nmin <> -1 Then
-
vec1(Nmin) = vec1(a)
-
vec1(a) = min
-
End If
-
Nmin = -1
-
Next
-
tim1F = getMilisegundos(DateTime.Now)
-
-
'imprimimos vectores 1,2 y 3 ordenados
-
txt1.Text = ""
-
str1 = ""
-
For a = 0 To vec1.Length - 1
-
str1 &= vec1(a) & vbNewLine
-
Next
-
-
txt1.Text = str1
-
-
'imprimimos resultados
-
lblcomp1.Text = ""
-
lblinter1.Text = ""
-
lbltime1.Text = ""
-
-
lblcomp1.Text = "Comparaciones: " & comp1
-
lbltime1.Text = "Tiempo: " & CType((tim1F - tim1I), String) & " ms"
-
End Sub
-
End Class
Aquí te dejo los archivos para que los descargues:
Descarga