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
- 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, aux, saltos, comp1, flag 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 Shell y contamos el tiempo trancurrido y total de intercambios
- comp1 = 0
- tim1I = getMilisegundos(DateTime.Now)
- saltos = CType(vec1.Length / 2, Integer) 'obtenemos el valor del primero salto
- While (saltos <> 0) 'mientras que saltos sea diferente de cero (0)
- a = 0
- flag = 0 'cada vuelta externa se tiene que reinciar la bandera
- While (a + saltos <vec1.Length)
- comp1 += 1 'incrementamos el contador de comparaciones
- If vec1(a)> vec1(a + saltos) Then 'intercambiamos numeros
- aux = vec1(a)
- vec1(a) = vec1(a + saltos)
- vec1(a + saltos) = aux
- flag = 1 'activamos bandera que nos indica que hubo intercambio
- End If
- a += 1
- End While
- If (flag <> 1) Then saltos -= 1 'si NO hubo intercambio, entonces decrementamos los saltos
- End While
- 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
http://www.recursosdelweb.com/ordenamiento-shell-shell-sort-en-visual-basic-net-vb/
¿Para cuál clase quieres estos puntos extra?
ResponderEliminarTe pongo +3 en algoritmos.
ResponderEliminar