Share the joy
This is a practice for heap. The problem is from this blog: link
check my recent code on github by PriorityQueue: link
- package feb;
- public class FindMedian {
- /*
- * Return the median of arr[]. It uses a max heap, min heap. Keep the number
- * of elements in 2 heaps differ less than 1.
- */
- public static int findMedian(int[] arr) {
- if (arr == null) {
- return -1;
- }
- if (arr.length == 1) {
- return arr[0];
- }
- if (arr.length == 2) {
- return arr[0] < arr[1] ? arr[0] : arr[1];
- }
- int[] maxHeap = new int[arr.length / 2 + 2];
- int[] minHeap = new int[arr.length / 2 + 2];
- maxHeap[0] = arr[0] < arr[1] ? arr[0] : arr[1];
- minHeap[0] = arr[0] > arr[1] ? arr[0] : arr[1];
- for (int i = 1; i < maxHeap.length; i++) {
- maxHeap[i] = Integer.MIN_VALUE;
- minHeap[i] = Integer.MAX_VALUE;
- }
- int[] maxHeapNum = new int[1];
- maxHeapNum[0] = 1;
- int[] minHeapNum = new int[1];
- minHeapNum[0] = 1;
- for (int i = 2; i < arr.length; i++) {
- if (arr[i] < maxHeap[0]) {
- insertMaxHeap(maxHeap, arr[i], maxHeapNum);
- } else {
- insertMinHeap(minHeap, arr[i], minHeapNum);
- }
- if (minHeapNum[0] – maxHeapNum[0] > 1) {
- int moveEle = removeMinHeapTop(minHeap, minHeapNum);
- insertMaxHeap(maxHeap, moveEle, maxHeapNum);
- continue;
- }
- if (maxHeapNum[0] – minHeapNum[0] > 1) {
- int moveEle = removeMaxHeapTop(maxHeap, maxHeapNum);
- insertMinHeap(maxHeap, moveEle, minHeapNum);
- continue;
- }
- }
- return minHeapNum[0] > maxHeapNum[0] ? minHeap[0] : maxHeap[0];
- }
- /*
- * Insert value to max heap arr[]. maxHeapNum[] records the element number
- * of heap.
- */
- public static void insertMaxHeap(int[] arr, int value, int[] maxHeapNum) {
- arr[maxHeapNum[0]] = value;
- for (int i = maxHeapNum[0]; i > 0; i = (i – 1) >> 1) {
- if (arr[i] > arr[(i – 1) >> 1]) {
- int tmp = arr[i];
- arr[i] = arr[(i – 1) >> 1];
- arr[(i – 1) >> 1] = tmp;
- continue;
- }
- break;
- }
- maxHeapNum[0]++;
- }
- /*
- * Return the top of max heap of arr[]. maxHeapNum[] records the element
- * number of heap.
- */
- public static int removeMaxHeapTop(int[] arr, int[] maxHeapNum) {
- maxHeapNum[0]–;
- int result = arr[0];
- arr[0] = arr[maxHeapNum[0]];
- arr[maxHeapNum[0]] = Integer.MIN_VALUE;
- for (int i = 0; i <= (maxHeapNum[0] – 1) >> 1;) {
- int maxPos = arr[i * 2 + 1] > arr[i * 2 + 2] ? i * 2 + 1
- : i * 2 + 2;
- if (arr[maxPos] > arr[i]) {
- int tmp = arr[maxPos];
- arr[maxPos] = arr[i];
- arr[i] = tmp;
- i = maxPos;
- continue;
- }
- return result;
- }
- return result;
- }
- /*
- * Return the top of min heap of arr[]. minHeapNum[] records the element
- * number of heap.
- */
- public static int removeMinHeapTop(int[] arr, int[] minHeapNum) {
- minHeapNum[0]–;
- int result = arr[0];
- arr[0] = arr[minHeapNum[0]];
- arr[minHeapNum[0]] = Integer.MAX_VALUE;
- for (int i = 0; i <= (minHeapNum[0] – 1) >> 1;) {
- int minPos = arr[i * 2 + 1] < arr[i * 2 + 2] ? i * 2 + 1
- : i * 2 + 2;
- if (arr[minPos] < arr[i]) {
- int tmp = arr[minPos];
- arr[minPos] = arr[i];
- arr[i] = tmp;
- i = minPos;
- continue;
- }
- return result;
- }
- return result;
- }
- /*
- * Insert value to min heap arr[]. minHeapNum[] records the element number
- * of heap.
- */
- public static void insertMinHeap(int[] arr, int value, int[] minHeapNum) {
- arr[minHeapNum[0]] = value;
- for (int i = minHeapNum[0]; i > 0; i = (i – 1) >> 1) {
- if (arr[i] < arr[(i – 1) >> 1]) {
- int tmp = arr[i];
- arr[i] = arr[(i – 1) >> 1];
- arr[(i – 1) >> 1] = tmp;
- continue;
- }
- break;
- }
- minHeapNum[0]++;
- }
- public static void main(String[] args) {
- int[] arr = { 1, 2, 3, 6, 7, 8, 9, 5 };
- int median = findMedian(arr);
- System.out.println(median);
- }
- }