1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# mode: run
from libc.stdlib cimport abs as c_int_abs, qsort as libc_qsort
def libc_int_abs(int x):
"""
>>> libc_int_abs(5)
5
>>> libc_int_abs(-5)
5
"""
return c_int_abs(x)
cdef int gt(const void* v1, const void* v2) noexcept nogil:
return ((<int*>v1)[0] - (<int*>v2)[0])
cdef int lt(const void* v1, const void* v2) noexcept nogil:
return - gt(v1, v2)
def qsort(values, direction='lt'):
"""
>>> data = [1, 9, 3, 2, 5]
>>> qsort(data, 'gt')
[1, 2, 3, 5, 9]
>>> qsort(data, 'lt')
[9, 5, 3, 2, 1]
"""
cdef int[5] carray = values[:5]
libc_qsort(carray, 5, sizeof(int), lt if direction == 'lt' else gt)
return carray
|