算法--中位数计算
来源:互联网 发布:java反编译怎么用 编辑:程序博客网 时间:2024/04/28 11:24
中位数(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();
作者:JasenKin
出处:http://www.cnblogs.com/jasenkin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/jasenkin/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
- 算法--中位数计算
- 【leetcode4】用分治算法计算中位数问题
- 中位数计算
- SQL计算中位数
- 【Mysql】实现中位数计算
- SQL 查询计算中位数
- 【算法导论】中位数
- 查找中位数,在线算法
- 【算法】中位数 median
- 大数据中位数算法
- BFPRT(中位数的中位数)算法
- 算法 - 有两个相同大小数组均已按升序排列好,编程计算这两个数组的中位数(C++)
- 寻找中位数算法中的错误
- 算法 双堆维护中位数
- 找中位数O(n)算法
- 线性时间查找中位数算法
- 多种排序算法求中位数
- 求中位数,快速选择算法
- JAVA MAIL发送邮件实例
- 暑期规划
- Lua程序设计笔记一: 基础用法/类型与值
- 多核多线程技术编程
- ios定位服务详解
- 算法--中位数计算
- 递归获取XML元素
- git仓库管理分支误操作 导致文件丢失
- 将session的存储方式指向memcache
- [转载]开普勒生平
- 向人生的高空飞翔
- 利用多核多线程进行程序优化
- 基于Java的四大开源测试工具
- C#动态生成控件以及添加事件处理