-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgeneric_bubble_sort.h
36 lines (30 loc) · 936 Bytes
/
generic_bubble_sort.h
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
33
34
35
#ifndef GENERIC_BUBBLE_SORT_LIB
#define GENERIC_BUBBLE_SORT_LIB
#include <stddef.h>
static inline void swap(void* restrict v1, void* restrict v2, size_t p_size) {
unsigned char *p = v1, *q = v2, tmp;
for (size_t i = 0; i < p_size; ++i) {
tmp = p[i];
p[i] = q[i];
q[i] = tmp;
}
}
extern inline void sort(void *arr, size_t n, size_t value_size,
int (*cmp)(void*,void*))
{
for (size_t i = 0; i < n; ++i) {
for (size_t j = 0; j < n - i - 1; ++j) {
unsigned char *l = ((unsigned char*)arr) + j * value_size;
unsigned char *r = ((unsigned char*)arr) + (j+1) * value_size;
if (cmp(l, r) > 0)
swap(l, r, value_size);
}
}
}
extern inline int cmp_int(void *v1, void *v2) {
int *p = v1, *q = v2;
if (*p > *q) return 1;
else if (*p < *q) return -1;
else return 0;
}
#endif // GENERIC_BUBBLE_SORT_LIB