java 计算中位数的实现方法
最近工作需要要求把python的代码写成java版本,python中有一个np.median()求中位数的方法,java决定手写一个
先说说什么是中位数:
中位数就是中间的那个数,
如果一个集合是奇数个,那么中位数就是按大小排列后,最中间那个数,
如果一个集合是偶数个,那么中位数就是按大小排列后,最中间那2个数的平均数。
比如:
1,2,3,4,5那中位数就是3
1,2,3,4,5,6那中位数就是(3+4)/2=3.5
知道逻辑后方法就很简单了下面是代码
publicstaticvoidmain(String[]args){ Listtotal=newArrayList (); total.add(4); total.add(2); total.add(3); total.add(1); total.add(5); total.add(6); doublea=median(total); System.out.println(a); } privatestaticdoublemedian(List total){ doublej=0; //集合排序 Collections.sort(total); intsize=total.size(); if(size%2==1){ j=total.get((size-1)/2); }else{ //加0.0是为了把int转成double类型,否则除以2会算错 j=(total.get(size/2-1)+total.get(size/2)+0.0)/2; } returnj; }
1.方法内先判断集合是奇数还是偶数,如果是奇数那么就是第n+1/2个数,也就是下标为n-1/2的值,
如果是偶数就是第n/2和n/2+1的数的平均值也就是下标为n/2-1和n/2的平均值
2.该方法传入的是list集合如果为数组可以先用Arrays.aslist()方法转换后传入
补充知识:Java计算中位数、方差、标准差、众数
我就废话不多说了,大家还是直接看代码吧~
importjava.text.DecimalFormat; importjava.util.*; /** *数学算法(数学算法(方差、标准差、中位数、众数)) *@author * */ publicclassMathAlgorithm{ privatefinalstaticdoubledmax=999;//Double.MAX_VALUE;//Double类型的最大值,太大的double值,相乘会达到无穷大 privatefinalstaticdoubledmin=Double.MIN_VALUE;//Double类型的最小值 privatefinalstaticintn=100;//假设求取100个doubl数的方差和标准差 publicstaticvoidmain(String[]args){ Randomrandom=newRandom(); double[]x=newdouble[n]; for(inti=0;imodalNums=getModalNums(arr); System.out.println("众数:"+modalNums); float[]arr2={0.1f,1.1f,2.1f,3.1f,4.1f,5.1f,6.1f,7.1f,8.1f,9.1f,10.1f,1.1f,1.1f,2.1f,2.1f,3.1f,4.1f,5.1f}; List modalNums2=getModalNums(arr2); System.out.println("众数:"+modalNums2); } /** *方差s^2=[(x1-x)^2+...(xn-x)^2]/n *@paramx *@return */ publicstaticdoublegetVariance(double[]x){ intm=x.length; doublesum=0; for(inti=0;i nums.length/2-1){ index=partition(nums,start,index-1); }else{ index=partition(nums,index+1,end); } } }else{ while(index!=nums.length/2){ if(index>nums.length/2){ index=partition(nums,start,index-1); }else{ index=partition(nums,index+1,end); } } } returnnums[index]; } privatestaticintpartition(intnums[],intstart,intend){ intleft=start; intright=end; intpivot=nums[left]; while(left =pivot){ right--; } if(left nums.length/2-1){ index=partition(nums,start,index-1); }else{ index=partition(nums,index+1,end); } } }else{ while(index!=nums.length/2){ if(index>nums.length/2){ index=partition(nums,start,index-1); }else{ index=partition(nums,index+1,end); } } } returnnums[index]; } privatestaticintpartition(floatnums[],intstart,intend){ intleft=start; intright=end; floatpivot=nums[left]; while(left =pivot){ right--; } if(left getModalNums(int[]arr){ intn=arr.length; if(n==0){ returnnewArrayList (); } if(n==1){ returnArrays.asList(arr[0]); } Map freqMap=newHashMap<>(); for(inti=0;i >entries=newArrayList<>(freqMap.entrySet()); //对entries按出现频率从大到小排序 Collections.sort(entries,newComparator >(){ @Override publicintcompare(Map.Entry e1,Map.Entry e2){ returne2.getValue()-e1.getValue(); } }); List modalNums=newArrayList<>(); modalNums.add(entries.get(0).getKey());//排序后第一个entry的键肯定是一个众数 intsize=entries.size(); for(inti=1;i getModalNums(float[]arr){ intn=arr.length; if(n==0){ returnnewArrayList (); } if(n==1){ returnArrays.asList(arr[0]); } Map freqMap=newHashMap<>(); for(inti=0;i >entries=newArrayList<>(freqMap.entrySet()); //对entries按出现频率从大到小排序 Collections.sort(entries,newComparator >(){ @Override publicintcompare(Map.Entry e1,Map.Entry e2){ returne2.getValue()-e1.getValue(); } }); List modalNums=newArrayList<>(); modalNums.add(entries.get(0).getKey());//排序后第一个entry的键肯定是一个众数 intsize=entries.size(); for(inti=1;i 以上这篇java计算中位数的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。