算法--中位数计算
中位数(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();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库