Here I wrote a small simple example on the example of "Custom sorting".
#include <stdio.h> //выборочная сортировка void ssort(void* base, size_t num, size_t size, int (*cmp)(const void*,const void*)){ size_t t, i; char* a, *b, *p, *e, c; e = (char*)base + (size * num); for(a = (char*)base; a < e; a += size){ b = a; for(p = (char*)a + size; p < e; p += size){ if((*cmp)((const void*)p, (const void*)b) < 0) b = p; } if(a == b) continue; if(sizeof(size_t) == size){ t = *(size_t*)a; *(size_t*)a = *(size_t*)b; *(size_t*)b = t; } else { for(i = 0; i < size; ++i){ c = *(a + i); *(a + i) = *(b + i); *(b + i) = c; } } } } int icmp(const void* a, const void* b){//int return *(int*)a - *(int*)b; } int ccmp(const void* a, const void* b){//char return *(char*)a - *(char*)b; } int dcmp(const void* a, const void* b){//double double d1 = *(double*)a; double d2 = *(double*)b; if(d1 < d2) return -1; return (d1 > d2) ? 1 : 0; } int main(void){ int i; int a[] = { 4, 8, 3, 2, 0, 2, 1 }; int n1 = sizeof(a)/sizeof(a[0]); char b[] = { 'E', 'Z', 'C', 'F', 'B', 'D', 'A' }; int n2 = sizeof(b)/sizeof(b[0]); double c[] = { 1.2, 5.4, 1.2, 0.9, 0.2, 3.3, -7.1, 1.9, 1.2 }; int n3 = sizeof(c)/sizeof(c[0]); ssort(a, n1, sizeof(a[0]), &icmp);//int for(i = 0; i < n1; ++i) printf("%d ", a[i]); putchar('\n'); ssort(b, n2, sizeof(b[0]), &ccmp);//char for(i = 0; i < n2; ++i) printf("%c ", b[i]); putchar('\n'); ssort(c, n3, sizeof(c[0]), &dcmp);//double for(i = 0; i < n3; ++i) printf("%lg ", c[i]); return 0; }
ps an example without optimization, just cited for clarity
a += 5 * size? - VladDqsortitself? - Qwertiy ♦