程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 算法--中位數計算

算法--中位數計算

編輯:C#入門知識

中位數(Median)

 1、定義:一組數據按從小到大(或從大到小)的順序依次排列,處在中間位置的一個數(或最中間兩個數據的平均數,注意:和眾數不同,中位數不一定在這組數據中)。 

注:當個數為基數時,取最中間位置的數;當個數為偶數時,取最中間兩個數的平均數。

 2、從小到大排序,可以先用冒泡排序,然後取中位數,那麼先看下冒泡排序算法,代碼如下:

        public static void BubbleSort(this IList<double> array)
        {
            if (array == null || array.Count == 0)
            {
                return;
            }

            int count = array.Count;

            for (int i = 0; i < count - 1; i++)
            {
                for (int j = 0; j < count - i - 1; j++)
                {
                    if (array[j + 1] < array[j])
                    {
                        double temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }
        }

        public static void BubbleSort<T>(this IList<T> array) where T : IComparable
        {
            if (array == null || array.Count == 0)
            {
                return;
            }

            int count = array.Count;

            for (int i = 0; i < count - 1; i++)
            {
                for (int j = 0; j < count - i - 1; j++)
                {
                    if (array[j + 1].CompareTo(array[j]) < 0)
                    {
                        T temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }
        }

 一種為基本的算法,另外一種為泛型的。排序後取中位數即可。

3、但是我們並不需要全部從小到大排序,只需要一部分排序即可(即在冒泡的基礎上改進),先看代碼:

        public static double Median(this IList<double> array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }

            return array.ToArray().Median();
        }

        public static double Median(this double[] array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }

            int endIndex = array.Length / 2;

            for (int i = 0; i <= endIndex; i++)
            {
                for (int j = 0; j < array.Length - i - 1; j++)
                {
                    if (array[j + 1] < array[j])
                    {
                        double temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }

            if (array.Length % 2 != 0)
            {
                return array[endIndex];
            }

            return (array[endIndex - 1] + array[endIndex]) / 2;
        }

        public static decimal Median(this IList<decimal> array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }

            return array.ToArray().Median();
        }

        public static decimal Median(this decimal[] array)
        {
            if (array == null)
            {
                throw new ArgumentNullException("array");
            }

            int endIndex = array.Length / 2;

            for (int i = 0; i <= endIndex; i++)
            {
                for (int j = 0; j < array.Length - i - 1; j++)
                {
                    if (array[j + 1] < array[j])
                    {
                        decimal temp = array[j + 1];
                        array[j + 1] = array[j];
                        array[j] = temp;
                    }
                }
            }

            if (array.Length % 2 != 0)
            {
                return array[endIndex];
            }

            return (array[endIndex - 1] + array[endIndex]) / 2;
        }

 改進的代碼只有2行

            int endIndex = array.Length / 2;

            for (int i = 0; i <= endIndex; i++)

計算一半即可。個人還是喜歡用decimal來進行計算,誤差較小,雖然執行速度較其他基礎類型慢一點。

4、操作方式如下:

            double[] array = { 47,5,6,-88,6,1,-7,-17,-232};
            double result = array.Median();

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved