Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmpstr(void* v1, void* v2)
{
char *a1 = *(char**)v1;
char *a2 = *(char**)v2;
return strcmp(a1, a2);
}
// function for comparing two strings
void swap(void* v1, void* v2, int size)
{
char buffer[size];
memcpy(buffer, v1, size);
memcpy(v1, v2, size);
memcpy(v2, buffer, size);
}
void _qsort(void* v, int size, int left, int right,
int (*comp)(void*, void*))
{
void *vt, *v3;
int i, last, mid = (left + right) / 2;
if (left >= right)
return;
// casting void* to char* so that operations
// can be done.
void* vl = (char*)(v + (left * size));
void* vr = (char*)(v + (mid * size));
swap(vl, vr, size);
last = left;
for (i = left + 1; i <= right; i++) {
vt = (char*)(v + (i * size));
if ((*comp)(vl, vt) > 0) {
++last;
v3 = (char*)(v + (last * size));
swap(vt, v3, size);
}
}
v3 = (char*)(v + (last * size));
swap(vl, v3, size);
_qsort(v, size, left, last - 1, comp);
_qsort(v, size, last + 1, right, comp);
}
int main()
{
char* a[] = {"bbc", "xcd", "ede", "def",
"afg", "hello", "hmmm", "okay", "how", "welcome" };
_qsort(a, sizeof(char*), 0, 8, (int (*)(void*, void*))(cmpstr));
for (int i = 0; i < 10; i++)
printf("%s ", a[i]);
printf("\n");
}
The desired output for the input is shown.