Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sort.qh
Go to the documentation of this file.
1#pragma once
2
4USING(swapfunc_t, void (int i1, int i2, entity pass));
6USING(comparefunc_t, int (int i1, int i2, entity pass));
7
10{
11 #define heapify(_count) \
12 MACRO_BEGIN \
13 for (int start = floor(((_count) - 2) / 2); start >= 0; --start) \
14 { \
15 siftdown(start, (_count) - 1); \
16 } \
17 MACRO_END
18
19 #define siftdown(_start, _end) \
20 MACRO_BEGIN \
21 for (int root = (_start); root * 2 + 1 <= (_end); ) \
22 { \
23 int child = root * 2 + 1; \
24 if (child < (_end) && cmp(child, child + 1, pass) < 0) child += 1; \
25 if (cmp(root, child, pass) >= 0) break; \
26 swap(root, child, pass); \
27 root = child; \
28 } \
29 MACRO_END
30
31 heapify(n);
32 int end = n - 1;
33 while (end > 0)
34 {
35 swap(0, end, pass);
36 end -= 1;
37 siftdown(0, end);
38 }
39}
40
42void shuffle(float n, swapfunc_t swap, entity pass)
43{
44 for (int i = 1; i < n; ++i)
45 {
46 // swap i-th item at a random position from 0 to i
47 // proof for even distribution:
48 // n = 1: obvious
49 // n -> n+1:
50 // item n+1 gets at any position with chance 1/(n+1)
51 // all others will get their 1/n chance reduced by factor n/(n+1)
52 // to be on place n+1, their chance will be 1/(n+1)
53 // 1/n * n/(n+1) = 1/(n+1)
54 // q.e.d.
55 int j = floor(random() * (i + 1));
56 if (j != i) swap(j, i, pass);
57 }
58}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
#define pass(name, colormin, colormax)
#define ERASEABLE
Definition _all.inc:37
#define USING(name, T)
Definition _all.inc:72
float random(void)
float floor(float f)
#define siftdown(_start, _end)
ERASEABLE void shuffle(float n, swapfunc_t swap, entity pass)
Definition sort.qh:42
ERASEABLE void heapsort(int n, swapfunc_t swap, comparefunc_t cmp, entity pass)
Definition sort.qh:9
int(int i1, int i2, entity pass) comparefunc_t
<0 for <, ==0 for ==, >0 for > (like strcmp)
Definition sort.qh:6
void(int i1, int i2, entity pass) swapfunc_t
is only ever called for i1 < i2
Definition sort.qh:4
#define heapify(_count)