堆排序 获取中位数

81 阅读1分钟

题目

插入数据后,能够取得中位数,这里的中位数即数值在中间的数(logN)

  • 如果一个数是中位数,则它一定小于等于右边最小的数,大于等于左边最大的数,所以准备一个大根堆,放比中位数小的数,准备一个小根堆,放比中位数大的数
  • 所以有规律,将第一个数放入大根堆堆顶后,如果后续的数比大根堆堆顶的数大,则放入小根堆,否则放入大根堆,如果大根堆和小根堆的元素长度>=2,则弹出较多一方的堆顶进另一个堆中,最终中位数就是大根堆的堆顶
// 插入数据,随时能够取得中位数(logN)级别
// 大顶堆highHeap,小顶堆lowHeap
function getMid(num) {
  if (!highHeap.length && !lowHeap.length) {
    highHeap.insert(num);
  }
  if (highHeap[0] > num) {
    highHeap.insert(num);
  } else {
    lowHeap.insert(num);
  }

  if (highHeap.length - lowHeap.length >= 2) {
    let temp = highHeap.pop();
    lowHeap.insert(temp);
  }
  if (lowHeap.length - highHeap.length >= 2) {
    let temp = lowHeap.pop();
    highHeap.insert(temp);
  }

  return highHeap[0];
}