- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
void sort(void *a, int n, int size, int (*cmp)(const void*, const void*)) {
int j;
if (n <= 1) return;
if (n == 2) {
if (cmp(a + size*1, a)) {
for (j = 0; j < size; j++) {
SWAP(*(char*)(a + j + size), *(char*)(a + j));
}
}
return;
}
int d, p = 0, i;
for (i = 1; i < n; i++) {
if (cmp(a + size*i, a + size*(i-1))) { d = i; goto sorting; }
}
return;
sorting:
static char buf[128];
memcpy(buf, a + size*d, size);
for (i = 0; i < n; i++) {
if (!cmp(buf, a + i*size)) {
for (j = 0; j < size; j++) {
SWAP(*(char*)(a + j + i*size), *(char*)(a + j + p*size));
}
p++;
}
}
sort(a, p, size, cmp);
sort(a+p*size, n-p, size, cmp);
}
Попросили по программированию в универе написать сортировку на С. Написал.
сразу видно — программист!
И пустой наслучай если не захочет
Ты проверял?
SWAP, очевидно, вот такой вот:
#define SWAP(X,Y) do { __auto_type _swap_tmp = (X); (X) = (Y); (Y) = _swap_tmp; } while (0)
чтоб можно было написать SWAP(array[index++], array[other_index]); и радоваться результату
–Вы слыхали, Петров-то наш амбидекстер!
–Кто??
–Петров!
https://github.com/torvalds/linux/blob/045958acaa75205b31578cb22c4345e28dd2e4bf/include/linux/minmax.h#L308
Напомнило, как приходится делать пачку #undef после того, как включил какой-нибудь заголовок из Windows SDK. Если не сделать #undef, весь код плывёт.
Ну кстати со стеной может и не скомпилируется: ты память измеряешь в интах, как в борланд си три ноль в 1992-м году
\
К тому же, складывать всё в int, пока влезает -- очень привычно для так называемых "олимпиадников"
плавающие петухи не нужны, большинство задач можно решить целичисленными типами
У древних людей и FPU-то никакого не было.
> один поинтер 64-битный
У дренвих людей поинтер был два байта, и ничего, как-то справлялись.