git
/
stable-qsort.c
56 строк · 986.0 Байт
1#include "git-compat-util.h"
2
3/*
4* A merge sort implementation, simplified from the qsort implementation
5* by Mike Haertel, which is a part of the GNU C Library.
6*/
7
8static void msort_with_tmp(void *b, size_t n, size_t s,
9int (*cmp)(const void *, const void *),
10char *t)
11{
12char *tmp;
13char *b1, *b2;
14size_t n1, n2;
15
16if (n <= 1)
17return;
18
19n1 = n / 2;
20n2 = n - n1;
21b1 = b;
22b2 = (char *)b + (n1 * s);
23
24msort_with_tmp(b1, n1, s, cmp, t);
25msort_with_tmp(b2, n2, s, cmp, t);
26
27tmp = t;
28
29while (n1 > 0 && n2 > 0) {
30if (cmp(b1, b2) <= 0) {
31memcpy(tmp, b1, s);
32tmp += s;
33b1 += s;
34--n1;
35} else {
36memcpy(tmp, b2, s);
37tmp += s;
38b2 += s;
39--n2;
40}
41}
42if (n1 > 0)
43memcpy(tmp, b1, n1 * s);
44memcpy(b, t, (n - n2) * s);
45}
46
47void git_stable_qsort(void *b, size_t n, size_t s,
48int (*cmp)(const void *, const void *))
49{
50const size_t size = st_mult(n, s);
51char *tmp;
52
53tmp = xmalloc(size);
54msort_with_tmp(b, n, s, cmp, tmp);
55free(tmp);
56}
57