/** Inserts a num into the data structure. left of median=maxheap right of median=minheap*/ void addNum(struct MedianFinder* mf, int num) { if(!mf) return; int i = compare(mf->maxheap->count, mf->minheap->count); printf("\n median=%lf, num=%d",mf->median,num); switch(i) { case -1: if(num<mf->median) insertMaxHeap(mf->maxheap, num); else{ int e = mf->minheap->arr[0]; insertMaxHeap(mf->maxheap,e); mf->minheap->arr[0]=num; minHeapify(mf->minheap, 0); } mf->median=(double)((mf->maxheap->arr[0]+mf->minheap->arr[0])/2); break; case 0: if(num<mf->median) { insertMaxHeap(mf->maxheap, num); mf->median= mf->maxheap->arr[0]; } else{ insertMinHeap(mf->minheap, num); mf->median= mf->minheap->arr[0]; } break; case 1: if(num<mf->median){ int e = mf->maxheap->arr[0]; insertMinHeap(mf->minheap,e); mf->maxheap->arr[0]=num; maxHeapify(mf->maxheap, 0); } else{ insertMinHeap(mf->minheap, num); } mf->median=(mf->maxheap->arr[0]+mf->minheap->arr[0])/2; break; default: break; } }
void insertMedianOnline(MedianOnline *S, long int key) { long int temp, max, min; insertMaxHeap(&(S->Max), key); if((S->Max).A.heapSize > (S->Min).heapSize) { temp = extractMaxHeap(&(S->Max)); insertMinHeap(&(S->Min), temp); } if((S->Max).A.heapSize == (S->Min).heapSize) { if(peekMaxHeap(&(S->Max)) > peekMinHeap(&(S->Min))) { max = extractMaxHeap(&(S->Max)); min = extractMinHeap(&(S->Min)); insertMinHeap(&(S->Min), max); insertMaxHeap(&(S->Max), min); } } (S->size)++; }