|
Packit |
562c7a |
# tag: cpp
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
from libcpp cimport bool
|
|
Packit |
562c7a |
from libcpp.algorithm cimport make_heap, sort_heap, sort, partial_sort
|
|
Packit |
562c7a |
from libcpp.vector cimport vector
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
# XXX should use std::greater, but I don't know how to wrap that.
|
|
Packit |
562c7a |
cdef inline bool greater(int x, int y):
|
|
Packit |
562c7a |
return x > y
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def heapsort(l, bool reverse=False):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> heapsort([3, 5, 1, 0, 2, 4])
|
|
Packit |
562c7a |
[0, 1, 2, 3, 4, 5]
|
|
Packit |
562c7a |
>>> heapsort([3, 5, 1, 0, 2, 4], reverse=True)
|
|
Packit |
562c7a |
[5, 4, 3, 2, 1, 0]
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef vector[int] v = l
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
if reverse:
|
|
Packit |
562c7a |
make_heap(v.begin(), v.end(), greater)
|
|
Packit |
562c7a |
sort_heap(v.begin(), v.end(), greater)
|
|
Packit |
562c7a |
else:
|
|
Packit |
562c7a |
make_heap(v.begin(), v.end())
|
|
Packit |
562c7a |
sort_heap(v.begin(), v.end())
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
return v
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def partialsort(l, int k, reverse=False):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> partialsort([4, 2, 3, 1, 5], k=2)[:2]
|
|
Packit |
562c7a |
[1, 2]
|
|
Packit |
562c7a |
>>> partialsort([4, 2, 3, 1, 5], k=2, reverse=True)[:2]
|
|
Packit |
562c7a |
[5, 4]
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef vector[int] v = l
|
|
Packit |
562c7a |
if reverse:
|
|
Packit |
562c7a |
partial_sort(v.begin(), v.begin() + k, v.end(), greater)
|
|
Packit |
562c7a |
else:
|
|
Packit |
562c7a |
partial_sort(v.begin(), v.begin() + k, v.end())
|
|
Packit |
562c7a |
return v
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
|
|
Packit |
562c7a |
def stdsort(l, reverse=False):
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
>>> stdsort([3, 2, 1, 4, 5])
|
|
Packit |
562c7a |
[1, 2, 3, 4, 5]
|
|
Packit |
562c7a |
>>> stdsort([3, 2, 1, 4, 5], reverse=True)
|
|
Packit |
562c7a |
[5, 4, 3, 2, 1]
|
|
Packit |
562c7a |
"""
|
|
Packit |
562c7a |
cdef vector[int] v = l
|
|
Packit |
562c7a |
if reverse:
|
|
Packit |
562c7a |
sort(v.begin(), v.end(), greater)
|
|
Packit |
562c7a |
else:
|
|
Packit |
562c7a |
sort(v.begin(), v.end())
|
|
Packit |
562c7a |
return v
|