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(Listtotal){
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};
ListmodalNums2=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;inums.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(leftnums.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(leftgetModalNums(int[]arr){
intn=arr.length;
if(n==0){
returnnewArrayList();
}
if(n==1){
returnArrays.asList(arr[0]);
}
MapfreqMap=newHashMap<>();
for(inti=0;i>entries=newArrayList<>(freqMap.entrySet());
//对entries按出现频率从大到小排序
Collections.sort(entries,newComparator>(){
@Override
publicintcompare(Map.Entrye1,Map.Entrye2){
returne2.getValue()-e1.getValue();
}
});
ListmodalNums=newArrayList<>();
modalNums.add(entries.get(0).getKey());//排序后第一个entry的键肯定是一个众数
intsize=entries.size();
for(inti=1;igetModalNums(float[]arr){
intn=arr.length;
if(n==0){
returnnewArrayList();
}
if(n==1){
returnArrays.asList(arr[0]);
}
MapfreqMap=newHashMap<>();
for(inti=0;i>entries=newArrayList<>(freqMap.entrySet());
//对entries按出现频率从大到小排序
Collections.sort(entries,newComparator>(){
@Override
publicintcompare(Map.Entrye1,Map.Entrye2){
returne2.getValue()-e1.getValue();
}
});
ListmodalNums=newArrayList<>();
modalNums.add(entries.get(0).getKey());//排序后第一个entry的键肯定是一个众数
intsize=entries.size();
for(inti=1;i
以上这篇java计算中位数的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。