void Qsort(void *base, int len, int size, int (*cmp)(const void *, const void *))
{
for (int i = 0; i < len - 1; i++)
{
int minid = i;
for (int j = i + 1; j < len; j++)
if (cmp(base + minid * size, base + j * size) > 0)
minid = j;
char buf[size];
memcpy(buf, base + minid * size, size);
memcpy(base + minid * size, base + i * size, size);
memcpy(base + i * size, buf, size);
}
}
void *Bsearch(void *key, void *base, int len, int size, int (*cmp)(const void *, const void *))
{
void *lt = base;
void *rt = base + (len - 1) * size;
while (lt <= rt)
{
void *mid = lt + (rt - lt) / size / 2 * size;
if (cmp(mid, key) == 0)
return mid;
if (cmp(mid, key) < 0)
lt = mid + size;
else
rt = mid - size;
}
return NULL;
}
当然,如果在qsort中不想使用string.h
中的memcpy()
函数,也可以把qsort()
改写成以下样子。
void Qsort(void *base, int len, int size, int (*cmp)(const void *, const void *))
{
for (int i = 0; i < len - 1; i++)
{
int minid = i;
for (int j = i + 1; j < len; j++)
if (cmp(base + minid * size, base + j * size) > 0)
minid = j;
char temp;
for (int k = 0; k < size; k++)
{
temp = *(char *)(base + minid * size);
*(char *)(base + minid * size) = *(char *)(base + i * size);
*(char *)(base + i * size) = temp;
}
}
}