/// <summary>
        /// Finds Majority element in the given array using Boyer Moore Voting algorithm.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a">array</param>
        /// <returns>
        /// Majority element
        /// </returns>
        public static MajorityElementResult <T> FindMajorityElementByBoyerMooreAlgorithm <T>(T[] a)
        {
            MajorityElementResult <T> result = new MajorityElementResult <T>();

            if (a.Length > 0)
            {
                result.Count           = 1;
                result.MajorityElement = a[0];
            }

            for (int i = 1; i < a.Length; i++)
            {
                if (a[i] == null)
                {
                    continue;
                }

                if (a[i].Equals(result.MajorityElement))
                {
                    result.Count++;
                }
                else
                {
                    result.Count--;
                }

                if (result.Count == 0)
                {
                    result.MajorityElement = a[i];
                    result.Count           = 1;
                }
            }

            if (result.Count > 0)
            {
                result.Count = 0;
                for (int i = 0; i < a.Length; i++)
                {
                    if (a[i] == null)
                    {
                        continue;
                    }

                    if (a[i].Equals(result.MajorityElement))
                    {
                        result.Count++;
                    }
                }

                if (result.Count > Math.Floor(a.Length / 2.0))
                {
                    return(result);
                }
            }

            return(null);
        }
        /// <summary>
        /// Finds Majority element in the given array using brute force method.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="a">array</param>
        /// <returns>
        /// Majority element
        /// </returns>
        public static MajorityElementResult <T> FindMajorityElementByBruteForceMethod <T>(T[] a)
        {
            MajorityElementResult <T> result = new MajorityElementResult <T>();

            for (int i = 0; i < a.Length; i++)
            {
                if (a[i] == null)
                {
                    continue;
                }

                var tempCount = 0;
                for (int j = i; j < a.Length; j++)
                {
                    if (a[j] == null)
                    {
                        continue;
                    }

                    if (a[i].Equals(a[j]))
                    {
                        tempCount++;
                    }
                }

                if (tempCount > result.Count)
                {
                    result.Count           = tempCount;
                    result.MajorityElement = a[i];
                }
            }

            if (result.Count > Math.Floor(a.Length / 2.0))
            {
                return(result);
            }

            return(null);
        }