BoyerMoore Majority Voting Algorithm (original) (raw)

Boyer-Moore Majority Voting Algorithm

Last Updated : 4 Feb, 2026

The Boyer–Moore Voting Algorithm efficiently finds the majority element in an array—an element that appears more than N/2 times—using two passes. In the first pass, it selects a potential candidate by increasing a counter when the same element is encountered and decreasing it when a different element appears, effectively canceling out non-majority elements. In the second pass, the algorithm verifies whether this candidate actually occurs more than N/2 times. This method runs in O(N) time and requires only O(1) extra space, making it both fast and memory-efficient.

Let us see the algorithm and intuition behind its working, by taking an example -

**Input :{1,1,1,1,2,3,5} **Output : 1 **Explanation : 1 occurs more than 3 times. **Input : {1,2,3} **Output : -1 **Explanation: No element appears more than N/2times.

**Intuition Behind Working :

The algorithm is based on the idea that if an element occurs more than N/2 times, then all the remaining elements together must occur less than N/2 times.

While traversing the array, we maintain a candidate and a vote count:

By the end of the first traversal, the remaining candidate is the potential majority element. A second traversal is required to verify whether it actually appears more than N/2 times.

**Steps to implement the algorithm :

Step 1: Find a Candidate

Initialize candidate = -1 and votes = 0.

Traverse the array:

Step 2: Verify the Candidate

Dry Run for the Given Example

**Given array:
arr = {1, 1, 1, 1, 2, 3, 5}

First Traversal (Finding the Candidate)

Element 1 1 1 1 2 3 5
Votes 1 2 3 4 3 2 1
Candidate 1 1 1 1 1 1 1

After the first traversal, the candidate = 1.

Second Traversal (Verifying the Candidate)

Element 1 1 1 1 2 3 5
Count 1 2 3 4 4 4 4

Total elements = 7
Majority condition: count > 7 / 2 = 3

Since count = 4 > 3,

1 is the majority element.

C++ `

// C++ implementation for the above approach #include using namespace std; // Function to find majority element int findMajority(int arr[], int n) { int i, candidate = -1, votes = 0; // Finding majority candidate for (i = 0; i < n; i++) { if (votes == 0) { candidate = arr[i]; votes = 1; } else { if (arr[i] == candidate) votes++; else votes--; } } int count = 0; // Checking if majority candidate occurs more than n/2 // times for (i = 0; i < n; i++) { if (arr[i] == candidate) count++; }

if (count > n / 2)
    return candidate;
return -1;

} int main() { int arr[] = { 1, 1, 1, 1, 2, 3, 5 }; int n = sizeof(arr) / sizeof(arr[0]); int majority = findMajority(arr, n); cout << " The majority element is : " << majority; return 0; }

Java

import java.io.*;

class GFG {

// Function to find majority element public static int findMajority(int[] nums) { int count = 0, candidate = -1;

// Finding majority candidate
for (int index = 0; index < nums.length; index++) {
  if (count == 0) {
    candidate = nums[index];
    count = 1;
  }
  else {
    if (nums[index] == candidate)
      count++;
    else
      count--;
  }
}

// Checking if majority candidate occurs more than
// n/2 times
count = 0;
for (int index = 0; index < nums.length; index++) {
  if (nums[index] == candidate)
    count++;
}
if (count > (nums.length / 2))
  return candidate;
return -1;

// The last for loop and the if statement step can
// be skip if a majority element is confirmed to
// be present in an array just return candidate
// in that case

}

// Driver code public static void main(String[] args) { int arr[] = { 1, 1, 1, 1, 2, 3, 5 }; int majority = findMajority(arr); System.out.println(" The majority element is : " + majority); } }

Python

Python implementation for the above approach

Function to find majority element

def findMajority(arr, n): candidate = -1 votes = 0

# Finding majority candidate
for i in range (n):
    if (votes == 0):
        candidate = arr[i]
        votes = 1
    else:
        if (arr[i] == candidate):
            votes += 1
        else:
            votes -= 1
count = 0

# Checking if majority candidate occurs more than n/2
# times
for i in range (n):
    if (arr[i] == candidate):
        count += 1
        
if (count > n // 2):
    return candidate
else:
    return -1

Driver Code

arr = [ 1, 1, 1, 1, 2, 3, 5 ] n = len(arr) majority = findMajority(arr, n) print(" The majority element is :" ,majority)

C#

using System;

class GFG {

// Function to find majority element public static int findMajority(int[] nums) { int count = 0, candidate = -1;

// Finding majority candidate
for (int index = 0; index < nums.Length; index++) {
  if (count == 0) {
    candidate = nums[index];
    count = 1;
  }
  else {
    if (nums[index] == candidate)
      count++;
    else
      count--;
  }
}

// Checking if majority candidate occurs more than
// n/2 times
count = 0;
for (int index = 0; index < nums.Length; index++) {
  if (nums[index] == candidate)
    count++;
}
if (count > (nums.Length / 2))
  return candidate;
return -1;

// The last for loop and the if statement step can
// be skip if a majority element is confirmed to
// be present in an array just return candidate
// in that case

}

// Driver code public static void Main(String[] args) { int []arr = { 1, 1, 1, 1, 2, 3, 5}; int majority = findMajority(arr); Console.Write(" The majority element is : " + majority); } }

JavaScript

// Function to find the majority element function findMajority(arr) { let count = 0; let candidate = -1;

// Phase 1: Find candidate for (let i = 0; i < arr.length; i++) { if (count === 0) { candidate = arr[i]; count = 1; } else if (arr[i] === candidate) { count++; } else { count--; } }

// Phase 2: Verify candidate count = 0; for (let i = 0; i < arr.length; i++) { if (arr[i] === candidate) { count++; } }

return count > arr.length / 2 ? candidate : -1; }

// Driver code const arr = [1, 1, 1, 1, 2, 3, 5]; const majority = findMajority(arr);

console.log("The majority element is:", majority);

`

Output

The majority element is : 1

**Time Complexity: O(n) ( For two passes over the array )
**Space Complexity: O(1)