1 /* Sort.c -- Sort functions
\r
2 2010-09-17 : Igor Pavlov : Public domain */
\r
6 #define HeapSortDown(p, k, size, temp) \
\r
8 UInt32 s = (k << 1); \
\r
9 if (s > size) break; \
\r
10 if (s < size && p[s + 1] > p[s]) s++; \
\r
11 if (temp >= p[s]) break; \
\r
12 p[k] = p[s]; k = s; \
\r
15 void HeapSort(UInt32 *p, UInt32 size)
\r
21 UInt32 i = size / 2;
\r
26 HeapSortDown(p, k, size, temp)
\r
34 UInt32 temp = p[size];
\r
36 HeapSortDown(p, k, size, temp)
\r
42 UInt32 temp = p[size];
\r
43 UInt32 k = (p[3] > p[2]) ? 3 : 2;
\r
46 HeapSortDown(p, k, size, temp)
\r
49 UInt32 temp = p[size];
\r
51 if (size > 2 && p[2] < temp)
\r
62 #define HeapSortRefDown(p, vals, n, size, temp) \
\r
63 { UInt32 k = n; UInt32 val = vals[temp]; for (;;) { \
\r
64 UInt32 s = (k << 1); \
\r
65 if (s > size) break; \
\r
66 if (s < size && vals[p[s + 1]] > vals[p[s]]) s++; \
\r
67 if (val >= vals[p[s]]) break; \
\r
68 p[k] = p[s]; k = s; \
\r
71 void HeapSortRef(UInt32 *p, UInt32 *vals, UInt32 size)
\r
77 UInt32 i = size / 2;
\r
81 HeapSortRefDown(p, vals, i, size, temp);
\r
87 UInt32 temp = p[size];
\r
89 HeapSortRefDown(p, vals, 1, size, temp);
\r