lunes, 11 de julio de 2011

Algoritmo Ordenamiento Shell en Visual Basic -Extra

Que onda.

Continuando con los métodos de ordenamiento (y aprovechando que me los están dejando de tarea jaja) aquí les traigo el Ordenamiento Shell.

Este es una "version mejorada" del ordenamiento por burbuja, ya que también compara dos valores del vector y dependiendo de si uno es mayor que el otro, se intercambian. En si lo que hace el método Shell es, primeramente semiordenar el vector, para despues ordenarlo de bien a bien.

Veamos su funcionamiento:

Únicamente al inicio se obtiene el numero de salto (largo del vector/2). Nota: la división es redondeada al entero próximo inferior.
Un ciclo externo girará mientras el Salto sea diferente de 0
Un ciclo interno irá pasando por cada posición del vector iniciando en 0 hasta que el contador del ciclo interno + el Salto sea igual al tamaño del vector.
Dentro del ciclo interno se irán comparando la posición del vector actual con la posición del vector actual + Salto. Si vec[contador] > vec[contador + salto] entonces se intercambian los números, y de esta manera van quedando los numero de menor valor a la izquierda y los de mayor valor a la derecha del vector.
Al final se checa si hubo algún intercambio, si sí entonces se vuelve a repetir el proceso con el mismo salto, de lo contrario el salto se decrementa y se repite el proceso nuevamente.


Gráficamente sería algo como esto:
Ordenamiento Shell

  1. Public Class Form1
  2.     Private Function getMilisegundos(ByVal fecha As Date) As Long
  3.         Dim respuesta As Long = 0
  4.         Dim dteFechaAux As Date = New Date(1970, 1, 1, 0, 0, 0, 0)
  5.         respuesta = DateDiff(DateInterval.Second, dteFechaAux, fecha) * 1000 + fecha.Millisecond
  6.         Return respuesta
  7.     End Function
  8.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  9.         Dim vec1(1999) As Integer
  10.         Dim rand As New Random
  11.         Dim a, b, aux, saltos, comp1, flag As Integer
  12.         Dim str1 As String
  13.         Dim tim1I As Long = 0
  14.         Dim tim1F As Long = 0
  15.         'llenamos el primer vector de numeros aleatorios
  16.         For a = 0 To vec1.Length - 1
  17.             vec1(a) = rand.Next(0, 101)
  18.         Next
  19.         'ordenamos primer vector con metodo de Shell y contamos el tiempo trancurrido y total de intercambios
  20.         comp1 = 0
  21.         tim1I = getMilisegundos(DateTime.Now)
  22.         saltos = CType(vec1.Length / 2, Integer) 'obtenemos el valor del primero salto
  23.         While (saltos <> 0) 'mientras que saltos sea diferente de cero (0)
  24.             a = 0
  25.             flag = 0 'cada vuelta externa se tiene que reinciar la bandera
  26.             While (a + saltos <vec1.Length)
  27.                 comp1 += 1 'incrementamos el contador de comparaciones
  28.                 If vec1(a)> vec1(a + saltos) Then 'intercambiamos numeros
  29.                     aux = vec1(a)
  30.                     vec1(a) = vec1(a + saltos)
  31.                     vec1(a + saltos) = aux
  32.                     flag = 1 'activamos bandera que nos indica que hubo intercambio
  33.                 End If
  34.                 a += 1
  35.             End While
  36.             If (flag <> 1) Then saltos -= 1 'si NO hubo intercambio, entonces decrementamos los saltos
  37.         End While
  38.         tim1F = getMilisegundos(DateTime.Now)
  39.         'imprimimos vectores 1,2 y 3 ordenados
  40.         txt1.Text = ""
  41.         str1 = ""
  42.         For a = 0 To vec1.Length - 1
  43.             str1 &= vec1(a) & vbNewLine
  44.         Next
  45.         txt1.Text = str1
  46.         'imprimimos resultados
  47.         lblcomp1.Text = ""
  48.         lblinter1.Text = ""
  49.         lbltime1.Text = ""
  50.         lblcomp1.Text = "Comparaciones: " & comp1
  51.         lbltime1.Text = "Tiempo: " & CType((tim1F - tim1I), String) & " ms"
  52.     End Sub
  53. End Class

     http://www.recursosdelweb.com/ordenamiento-shell-shell-sort-en-visual-basic-net-vb/

2 comentarios: