Java 四分位算法


四分位算法實例(復制百度百科)

  —— 實例1:

    數據總量: 6, 47, 49, 15, 42, 41, 7, 39, 43, 40, 36

    由小到大排列的結果: 6, 7, 15, 36, 39, 40, 41, 42, 43, 47, 49

    一共11

    Q1 的位置=(11+1) × 0.25=3Q2 的位置=(11+1)× 0.5=6 Q3的位置=(11+1) × 0.75=9

    Q1 = 15

    Q2 = 40

    Q3 = 43

  —— 實例2

    數據總量: 7, 15, 36, 39, 40, 41

    一共6

    數列項為偶數項時,四分位數Q2為該組數列的中數,

    (n+1)/4= 7/4 =1.75Q1在第一與第二個數字之間,

    3(n+1)/4= 21/4 =5.25, Q3在第五與第六個數字之間,

    Q1 = 0.75*15+0.25*7 = 13,

    Q2 = (36+39)/2= 37.5,

    Q3 = 0.25*41+0.75*40 = 40.25.

 

Java 代碼

 1 public static void fourDivsion(double[] param){
 2         if(param == null || param.length < 4) return;
 3         // 轉成BigDecimal類型,避免失去精度
 4         BigDecimal[] datas = new BigDecimal[param.length];
 5         for(int i=0; i<param.length; i++){
 6             datas[i] = BigDecimal.valueOf(param[i]);
 7         }
 8         int len = datas.length;// 數組長度
 9         Arrays.sort(datas);    // 數組排序,從小到大
10         BigDecimal q1 = null;  // 第一四分位
11         BigDecimal q2 = null;  // 第二四分位
12         BigDecimal q3 = null;  // 第三四分位
13         int index = 0; // 記錄下標
14         // n代表項數,因為下標是從0開始所以這里理解為:len = n+1
15         if(len%2 == 0){ // 偶數
16             index = new BigDecimal(len).divide(new BigDecimal("4")).intValue();
17             q1 = datas[index-1].multiply(new BigDecimal("0.25")).add(datas[index].multiply(new BigDecimal("0.75")));
18             q2 = datas[len/2].add(datas[len/2-1]).divide(new BigDecimal("2"));
19             index = new BigDecimal(3*(len+1)).divide(new BigDecimal("4")).intValue();
20             q3 = datas[index-1].multiply(new BigDecimal("0.75")).add(datas[index].multiply(new BigDecimal("0.25")));
21         }else{ // 奇數
22             q1 = datas[new BigDecimal(len).multiply(new BigDecimal("0.25")).intValue()];
23             q2 = datas[new BigDecimal(len).multiply(new BigDecimal("0.5")).intValue()];
24             q3 = datas[new BigDecimal(len).multiply(new BigDecimal("0.75")).intValue()];
25         }
26         // 保留兩位小數(四舍五入),輸出到控制台
27         System.out.println(q1.setScale(2, BigDecimal.ROUND_HALF_UP)+" "+
28                 q2.setScale(2, BigDecimal.ROUND_HALF_UP)+" "+
29                 q3.setScale(2, BigDecimal.ROUND_HALF_UP));
30     }
31     
32     public static void main(String[] args) {
33         double[] temp = new double[]{6.0, 47.0, 49.0, 15.0, 42.0, 41.0, 7.0, 39.0, 43.0, 40.0, 36.0};
34         double[] temp1 = new double[]{7, 15, 36, 39, 40, 41};
35         IndexAnalysisService.fourDivsion(temp);
36         IndexAnalysisService.fourDivsion(temp1);
37     }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM