Task[edit]
Write a program to find the mode value of a collection.

The case where the collection is empty may be ignored. Care must be taken to handle the case where the mode is non-unique.

If it is not appropriate or possible to support a general collection, use a vector (array), if possible. If it is not appropriate or possible to support an unspecified value type, use integers.

See also
Tasks for calculating statistical measures



in one go
moving (sliding window)
moving (cumulative)

Mean
Arithmetic

Statistics/Basic
Averages/Arithmetic mean
Averages/Pythagorean means


Averages/Simple moving average




Geometric

Averages/Pythagorean means




Harmonic

Averages/Pythagorean means




Quadratic

Averages/Root mean square




Circular

Averages/Mean angle
Averages/Mean time of day




Median

Averages/Median




Mode

Averages/Mode




Standard deviation

Statistics/Basic



Cumulative standard deviation




' FB 1.05.0 Win64
 
Sub quicksort(a() As Integer, first As Integer, last As Integer)
  Dim As Integer length = last - first + 1
  If length < 2 Then Return 
  Dim pivot As Integer = a(first + length\ 2)
  Dim lft As Integer = first 
  Dim rgt As Integer = last 
  While lft <= rgt
    While a(lft) < pivot
      lft +=1
    Wend
    While a(rgt) > pivot
      rgt -= 1
    Wend
    If lft <= rgt Then
       Swap a(lft), a(rgt)
       lft += 1
       rgt -= 1
    End If 
  Wend
  quicksort(a(), first, rgt)
  quicksort(a(), lft, last)
End Sub
 
' The modal value(s) is/are stored in 'm'.
' The function returns the modal count.
Function mode(a() As Integer, m() As Integer, sorted As Boolean = false) As Integer
  Dim lb As Integer = LBound(a)
  Dim ub As Integer = UBound(a)
  If ub = -1 Then Return 0 '' empty array
  If Not sorted Then quicksort(a(), lb, ub)
  Dim cValue As Integer = a(lb) 
  Dim cCount As Integer = 1
  Dim cMax As Integer = 0
  '' We iterate to the end of the array plus 1 to ensure the 
  '' final value is dealt with properly  
  For i As Integer = lb + 1 To ub + 1
    If i <= ub AndAlso a(i) = cValue Then 
      cCount += 1
    Else  
      If cCount > cMax Then
        Erase m
        Redim m(1 To 1)
        m(1) = cValue
        cMax = cCount
      ElseIf cCount = cMax Then
        Redim Preserve m(1 To UBound(m) + 1)
        m(UBound(m)) = cValue    
      End If
      If i = ub + 1 Then Exit For
      cValue = a(i)
      cCount = 1
    End If
  Next
  Return cMax
End Function
 
Dim a(1 To 14) As Integer  = {1, 2, 3, 1, 2, 4, 2, 5, 2, 3, 3, 1, 3, 6}
Dim m() As Integer '' to store the mode(s) 
Dim mCount As Integer = mode(a(), m())
Print "The following are the modes which occur"; mCount; " times : "
For i As Integer = LBound(m) To UBound(m) : Print m(i); " "; : Next
Print
Print "Press any key to quit"
Sleep