1. 程式人生 > >已知兩個小數陣列,一個為資料一個為對應的權重,計算該資料的中位值

已知兩個小數陣列,一個為資料一個為對應的權重,計算該資料的中位值

首先我們要知道權重的意思,舉個例子數字a,b,c對應的權重為,a1,b1,c1。那麼該組資料的平均值就是(a*a1+b*b1+c*c1)/(a1+b1+c1)。
知道了這些我們在來想思路
首先就是計算勸平均值,然後讓陣列的各個值與平均值相減,最後把他們相減的值的絕對值進行比較,得到最小的然後再加上平均值,得到該組資料的中位值。
下面是程式碼

public class median {

    /**
     * @param 計算中位數
     */
    public static void main(String[] args) {
        double[] num = new double[]{0.5,1.24,18,1.4,2.1,3.2,2.5,13,2.6,18,2.25,1.2,1.83,1.3,2.1};
        double[] wnum = new double[]{0.8,0.2,1.98,1.4,2.1,3.8,2.1,2.12,0.5,5.6,1.1,1.2,3.5,1.2,1.5};
        double[] menum = new double[num.length];//資料和平均值的差      
        double sum = 0;//算上權重後資料之和
        double wsum = 0;//權重之和
        double avg = 0;//平均值
        for (int i = 0; i < num.length; i++) {
             sum = sum+num[i]*wnum[i];
             wsum = wsum+wnum[i];
        }
        avg = sum/wsum;
        for (int i = 0; i < menum.length; i++) {//計算各個資料和平均值的差
            menum[i] = num[i]-avg;
        }
        for (int i = 0; i < menum.length; i++) {//利用氣泡排序得到資料和平均值之差絕對值最小的數
            for (int j = 0; j < menum.length-1; j++) {
                if(Math.abs(menum[j]) > Math.abs(menum[j+1])){
                    double temp = menum[j];
                    menum[j] = menum[j+1];
                    menum[j+1] = temp; 
                }
            }
        }
        double mddianNum = avg+menum[0];
        System.out.println("中位值是:"+mddianNum);
    }

}