码迷,mamicode.com
首页 > 编程语言 > 详细

无序数组取中位数

时间:2020-05-19 12:15:57      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:dia   部分   ==   元素   poll   static   htm   add   class   

最暴力的 - 先排序

快一点的 - 快排,任选一个数,小的放前面,大的放后面,如果左部分的数量正好是(n-1)/ 2 那支点就找到了。否则的话,就继续找。

优雅的 - 构建一个最小堆,用前(n+1)/ 2 个元素构建一个最小堆,将其余元素尝试向里插入,比堆顶小的扔了,比堆顶大的留下,最后的队形就是中位数了。

public static double median(int[] array){
    int heapSize = array.length/2 + 1;
    PriorityQueue<Integer> heap = new PriorityQueue<>(heapSize);
    for(int i=0; i<heapSize; i++){
        heap.add(array[i]);
    }
    for(int i=heapSize; i<array.length; i++){
        if(heap.peek()<array[i]){
            heap.poll();
            heap.add(array[i]);
        }
    }
    if(array.length % 2 == 1){
        return (double)heap.peek();
    }
    else{
        return (double)(heap.poll()+heap.peek())/2.0;
    }
}

参考: https://www.cnblogs.com/shizhh/p/5746151.html

无序数组取中位数

标签:dia   部分   ==   元素   poll   static   htm   add   class   

原文地址:https://www.cnblogs.com/Fivee/p/12915922.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!