Fix std::make_heap's worst case time complexity
authorDavid Majnemer <david.majnemer@gmail.com>
Tue, 22 Jul 2014 06:07:09 +0000 (06:07 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Tue, 22 Jul 2014 06:07:09 +0000 (06:07 +0000)
commit8b5126027406918e5b1f6ff4be2e98d231bb7704
treea691cbc8ee1a1b224bf20222ca8680deeac4ee44
parentfc3d8f0a78fe326cd5403e86cfc03b0abf668f31
Fix std::make_heap's worst case time complexity

std::make_heap is currently implemented by iteratively applying a
siftup-type algorithm.  Since sift-up is O(ln n), this gives
std::make_heap a worst case time complexity of O(n ln n).

The C++ standard mandates that std::make_heap make no more than O(3n)
comparisons, this makes our std::make_heap out of spec.

Fix this by introducing an implementation of __sift_down and switch
std::make_heap to create the heap using it.
This gives std::make_heap linear time complexity in the worst case.

This fixes PR20161.

llvm-svn: 213615
libcxx/include/algorithm
libcxx/test/algorithms/alg.sorting/alg.heap.operations/make.heap/make_heap_comp.pass.cpp