Rimuovere elementi contigui uguali in un array con VB.NET

Piccolo snippet tanto per

Dim n As Integer = 0
Dim lista_vettore As List(Of Integer) = {1, 2, 3, 4, 5, 6, 6, 7, 6, 8, 8, 9}.ToList
Do Until lista_vettore.Count = 0 Or n = lista_vettore.Count
     If lista_vettore(n) = lista_ vettore(n+1) Then
          lista_vettore.RemoveAt(n)
     End If
     n += 1
Loop
'lista_vettore sarà ora:
'{1, 2, 3, 4, 5, 6, 7, 6, 8, 9}

Bound Sort

Ho inventato un algortimo di ordinamento piuttosto efficiente (non chiedetemi quanto perchè ho provato a capire come si misuri l’efficienza di un algoritmo ma è una causa persa). L’ho confrontato con un’implementazione il bubble sort, e su liste abbastanza lunghe (dai 15 elementi in su, anche ripetuti) è decisamente migliore.
L’ho chiamato Bound sort poichè crea la lista ordinata a partire dai suoi estremi destro e sinistro.

Ecco i passaggi dell’algoritmo:

  1. Si trova il numero maggiore della lista, memorizzando il valore più grande che trova man mano che itera nella lista
  2. Si trova il numero minore della lista, memorizzando il valore più piccolo che trova man mano che itera nella lista
  3. Si aggiungono tutti i numeri della lista uguali al maggiore alla fine di una seconda lista
  4. Si aggiungono tutti i numeri della lista uguali al minore all’inizio della seconda lista
  5. Si rimuovono dalla prima lista tutti gli elementi uguali al maggiore o al minore trovati
  6. Si ripete il procedimento finchè non rimangono più numeri nella prima lista
  7. La seconda lista conterrà tutti gli elementi della prima in ordine crescente

Ed eccone un’implementazione in VB.NET:

Function BoundSort(ByVal ListToSort As List(Of Integer)) As Integer()
Dim SortedList(0 To ListToSort.Count - 1) As Integer
Dim Min as Integer
Dim Max as Integer
Dim posMax As Integer = ListToSort.Count - 1
Dim posMin As Integer = 0
Dim n As Integer

Do
      Min = ListToSort.Item(0)
      Max = ListToSort.Item(ListToSort.Count - 1)

      'trovo il maggiore e il minore
      n = 0
      For Each n In ListToSort
            If n < Min Then Min = n
            If n > Max Then Max = n
      Next

      'aggiungo alla fine della lista i maggiori
      n = 0
      For Each n In ListToSort
            If n = Max Then
                  SortedList(posMax) = n
                  posMax -= 1
            End If
      Next

      'aggiungo all'inizio della lista i minori
      n = 0
      For Each n In ListToSort
            If n = Min Then
                  SortedList(posMin) = n
                  posMin += 1
            End If
      Next

      'elimino maggiori e minori
      ListToSort.RemoveAll(Function(x As Integer) x = Max Or x = Min)
Loop Until ListToSort.Count = 0
Return SortedList
End Function

Il fatto che usi una lista invece che un array è puramente pratico, poichè operazione di aggiunta/rimozione sono molto più facili per una lista piuttosto che per un array.