Ejemplo n.º 1
0
int FindMedian(std::vector<int> &vec) {
    std::vector<int> min_heap(1, INT_MAX), max_heap(1, INT_MIN);
    for (int i = 0; i < vec.size(); i++) {
        if (vec[i] < max_heap[0]) {
            if (max_heap.size() > min_heap.size()) {
                int root = PopHeapRoot(max_heap, true);
                InsertHeap(min_heap, root, false);
            }
            InsertHeap(max_heap, vec[i], true);
        } else if (vec[i] > min_heap[0]) {
            if (min_heap.size() >= max_heap.size()) {
                int root = PopHeapRoot(min_heap, false);
                InsertHeap(max_heap, root, true);
            }
            InsertHeap(min_heap, vec[i], false);
        } else {
            if (min_heap.size() >= max_heap.size())
                InsertHeap(max_heap, vec[i], true);
            else
                InsertHeap(min_heap, vec[i], false);
        }
    }
    return max_heap[0];
}
Ejemplo n.º 2
0
	NOINLINE int SearchContext::Search(float searchLx, float searchLy, float searchHx, float searchHy, const int32_t count, Point* out_points)
	{
		this->searchWindow[0] = searchLx;
		this->searchWindow[1] = searchLy;
		this->searchWindow[2] = -searchHx;
		this->searchWindow[3] = -searchHy;

		HeapItem * heapEnd;
		if (levels > 1)
		{
			ProcessTopGrid(childrenToCheck[0]);
			for (unsigned i = 1; i < levels - 1; ++i)
			{
				ProcessIntermediateGrid(childrenToCheck[i - 1], childrenToCheck[i]);
			}
			heapEnd = ProcessLowestGrid(childrenToCheck[levels - 2], heap);
		}
		else
		{
			static const unsigned top[] = { 0, 1, -1 };
			heapEnd = ProcessLowestGrid(top, heap);
		}

		FixHeap(heap, heapEnd);
		BuildHeap(heap, heapEnd);

		int found = 0;

		while (heap != heapEnd)
		{
			const Point * pt = PopHeapRoot(heap, heapEnd);

			*out_points++ = *pt;
			if (++found == count)
			{
				break;
			}
		}

		return found;
	}