62 lines
2.9 KiB
C
62 lines
2.9 KiB
C
#define bool int
|
|
#define true 1
|
|
#define false 0
|
|
|
|
#define _template_func_def(T, func) T_DEFINE_##func(T)
|
|
#define _template_func(T, func) T_##func##__##T
|
|
|
|
#define SORT_PREDICATE(type, name) bool name(type a, type b)
|
|
#define SORT_SWAP(type, a, b) \
|
|
{ \
|
|
const type _BLOCK_T = a; \
|
|
a = b; \
|
|
b = _BLOCK_T; \
|
|
}
|
|
|
|
#define T_DEFINE_less(T) \
|
|
SORT_PREDICATE(T, T_less__##T) { return a < b; }
|
|
#define T_DEFINE_greater(T) \
|
|
SORT_PREDICATE(T, T_greater__##T) { return a > b; }
|
|
|
|
#define T_DEFINE_sort(T) \
|
|
void T_sort__##T(T *start, const T *end, bool (*predicate)(T, T)) { \
|
|
T *i, *j; \
|
|
for (i = start; i < end; i++) { \
|
|
for (j = i; j < end; j++) { \
|
|
if (predicate(*i, *j)) { \
|
|
SORT_SWAP(T, *i, *j); \
|
|
} \
|
|
} \
|
|
} \
|
|
}
|
|
|
|
#define T_DEFINE_sort_default(T) \
|
|
void T_sort_default__##T(T *start, const T *end) { \
|
|
T_sort__##T(start, end, _template_func(T, less)); \
|
|
}
|
|
|
|
#define T_DEFINE_sort_init(T) \
|
|
_template_func_def(T, less); \
|
|
_template_func_def(T, greater); \
|
|
_template_func_def(T, sort); \
|
|
_template_func_def(T, sort_default);
|
|
|
|
#define for_i(i, range, inner) \
|
|
{ \
|
|
int i; \
|
|
for (i = 0; i < range; i++) \
|
|
inner; \
|
|
}
|
|
|
|
T_DEFINE_sort_init(int);
|
|
|
|
#include <stdio.h>
|
|
|
|
int main() {
|
|
int n, a[301] = {0};
|
|
scanf("%d", &n);
|
|
for_i(i, n, scanf("%d", a + i));
|
|
_template_func(int, sort)(a, a + n, _template_func(int, greater));
|
|
for_i(i, n, printf("%d ", a[i]));
|
|
return 0;
|
|
} |