Ejemplo n.º 1
0
/** 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;
  }
}
Ejemplo n.º 2
0
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)++;
}