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 :P

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:

  1. 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
  2. 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:

para i=1 hasta n-1
    minimo = i;
    para j=i+1 hasta n
        si lista[j] < lista[minimo] entonces
            minimo = j /* (!) */
        fin si
    fin para
    intercambiar(lista[i], lista[minimo])
fin para


Esta es una imagen de como queda este método en Visual Basic .Net:

y he aquí el código:

VB.NET:
  1. Public Class Form1
  2.  
  3.     Private Function getMilisegundos(ByVal fecha As Date) As Long
  4.         Dim respuesta As Long = 0
  5.         Dim dteFechaAux As Date = New Date(1970, 1, 1, 0, 0, 0, 0)
  6.         respuesta = DateDiff(DateInterval.Second, dteFechaAux, fecha) * 1000 + fecha.Millisecond
  7.         Return respuesta
  8.     End Function
  9.  
  10.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  11.         Dim vec1(1999) As Integer
  12.         Dim rand As New Random
  13.         Dim a, b, min, Nmin, comp1 As Integer
  14.         Dim str1 As String
  15.         Dim tim1I As Long = 0
  16.         Dim tim1F As Long = 0
  17.  
  18.         'llenamos el primer vector de numeros aleatorios
  19.         For a = 0 To vec1.Length - 1
  20.             vec1(a) = rand.Next(0, 101)
  21.         Next
  22.  
  23.         'ordenamos primer vector con metodo de Selección y contamos el tiempo trancurrido y total de intercambios
  24.         comp1 = 0
  25.         tim1I = getMilisegundos(DateTime.Now)
  26.         Nmin = -1
  27.         For a = 0 To vec1.Length - 2
  28.             min = vec1(a)
  29.             For b = a + 1 To vec1.Length - 1
  30.                 comp1 += 1 'incrementamos el contador de comparaciones
  31.  
  32.                 If vec1(b) <min Then
  33.                     Nmin = b
  34.                     min = vec1(b)
  35.                 End If
  36.             Next
  37.             If Nmin <> -1 Then
  38.                 vec1(Nmin) = vec1(a)
  39.                 vec1(a) = min
  40.             End If
  41.             Nmin = -1
  42.         Next
  43.         tim1F = getMilisegundos(DateTime.Now)
  44.  
  45.         'imprimimos vectores 1,2 y 3 ordenados
  46.         txt1.Text = ""
  47.         str1 = ""
  48.         For a = 0 To vec1.Length - 1
  49.             str1 &= vec1(a) & vbNewLine
  50.         Next
  51.  
  52.         txt1.Text = str1
  53.  
  54.         'imprimimos resultados
  55.         lblcomp1.Text = ""
  56.         lblinter1.Text = ""
  57.         lbltime1.Text = ""
  58.  
  59.         lblcomp1.Text = "Comparaciones: " & comp1
  60.         lbltime1.Text = "Tiempo: " & CType((tim1F - tim1I), String) & " ms"
  61.     End Sub
  62. End Class

Aquí te dejo los archivos para que los descargues:
Descarga

Fuente del algoritmo
Fuente de la imagen