zoukankan      html  css  js  c++  java
  • 算法--中位数计算

    中位数(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();
  • 相关阅读:
    maven 构建 war文件&&Glassfish运行+部署war文件+访问(命令行模式)
    配置Glassfish服务器、部署Java web项目、Maven安装配置及JDK版本匹配性问题
    配置apache-maven-3.6.0时所遇到的坑(二)
    配置apache-maven-3.6.0时所遇到的坑(一)
    对Functional Language的认识
    论Injection的前世今生
    简单实现美团手机版应用源码
    WindowsPhone8可缩放图片控件的实现
    MallBuilder 多用户商城管理系统 v5.8.1.1
    Windows Phone 带文本信息的进度条
  • 原文地址:https://www.cnblogs.com/itboys/p/7283973.html
Copyright © 2011-2022 走看看