问题一:一个有序数组(从大到小) 长度为13 中位数为 18
int arr[] = new int[]{1, 3, 5, 6, 11, 14, 18, 21, 27, 29, 31, 56, 59}
但是我们这个数组是动态的,每次都插入一个数据,这样没插入依次中位数就要破环,而且还要每次排序,这样会很慢。
我们思路是这样维护一个大小,顶堆。 大顶堆存放0-5 元素,小顶堆 存放 6到12 ,这样小顶堆的堆顶就是中位数。
为题二:如何求解一个动态数组中,取出排名前k的数据;举一个现实问题,百度文章搜索量如何求动态求排名前10位的文章(文中的搜索量是不断变化的,你买次都遍历求topK是非常耗时间的)
大顶堆:堆顶元素是整个集合中最大的元素,同理 小顶堆是整个集合最小的元素。
这里 我们采用数组形式实现顶锥(另一种实现方式是链表形式)
大顶堆代码:
package com.jxd.test;
public class BigHeap {
private int heapCont[];
/**
* 堆中能存储的最大数据个数
*/
private int tab;
/**
* 堆中已经存在数据的个数
*/
private int count;
public BigHeap(int capacity) {
heapCont = new int[capacity + 1];//因为0号位没法使用
tab = capacity;
count = 0;
}
/**
* n表示原数组中有数据个数
*
* @param heapCont
* @param n
*/
public BigHeap(int[] heapCont, int n) {
this.heapCont = heapCont;
tab = heapCont.length;
count = n;
blindHeap(count);
}
/**
* 向堆中插入数据
* 从下往上法