在 cython 中排序

fir*_*aus 2 python cython

我是 cython 的新手,我正在尝试编写一个需要重复对部分排序数组进行排序的算法。看起来python的标准排序(timsort?)对此非常有用,但我还没有弄清楚如何从cythonized函数内部调用这个函数。

也就是说,我想做类似的事情:

cdef void myfunc(double* y) nogil:
    double *y_sort = sort(y)
Run Code Online (Sandbox Code Playgroud)

任何有关如何执行此操作的指示将不胜感激。

J.J*_*ala 5

标准 C 库提供qsort

# from libc.stdlib cimport qsort
# ... declaring "const void *" type seems problematic

# /sf/ask/584715351/$
cdef extern from "stdlib.h":
    ctypedef void const_void "const void"
    void qsort(void *base, int nmemb, int size,
                int(*compar)(const_void *, const_void *)) nogil

cdef int mycmp(const_void * pa, const_void * pb):
    cdef double a = (<double *>pa)[0]
    cdef double b = (<double *>pb)[0]
    if a < b:
        return -1
    elif a > b:
        return 1
    else:
        return 0

cdef void myfunc(double * y, ssize_t l) nogil:
    qsort(y, l, sizeof(double), mycmp)
Run Code Online (Sandbox Code Playgroud)

如果数组是“几乎排序的”,那么插入排序可能会更好:https : //stackoverflow.com/a/2726841/5781248