Blame tests/run/libcpp_algo.pyx

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