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]; }
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; }