typedef int __cdecl compare_ptr const void const void void swap char c

 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
36
37
typedef int(__cdecl* compare_ptr)(const void *, const void *);
void swap(char * a, char * b, unsigned dwSizeElement)
{
for (unsigned i = 0; i < dwSizeElement; ++i) {
char tmp = b[i];
b[i] = a[i];
a[i] = tmp;
}
}
int compare_int(const void *a, const void *b)
{
// Приводим указатели к нужному типу и разименовываем их, после чего вычисляем разность
return *(int *)a - *(int *)b;
}
void sort(
void * pBase, // Указатель на начало массива
unsigned dwCountElement,// Кол-во элементов в массиве
unsigned dwSizeElement, // Размер элемента
compare_ptr fn // Callback - функция сравнения 2-х элементов
)
{
char * pStart = (char *)pBase, *pCur = (char *)pBase;
// Проход по массиву от 0 до n-1 элемента
for (unsigned i = 0; i < dwCountElement; ++i) {
// Поиска элемента, меньше i-го
for (unsigned j = i + 1; j < dwCountElement; ++j) {
// Сравниваем элементы
if (fn(pStart + j * dwSizeElement, pStart + (i) * dwSizeElement) < 0)
{
swap(pStart + j * dwSizeElement, pStart + (i) * dwSizeElement, dwSizeElement);
}
}
}
}