
#include <stdio.h>

#include <string.h>

typedef int (*COMPAREFUNC)(void* p1, void *p2);

typedef void (*SELECT)(void **a, int len);

int compfunc(void *p1, void *p2);

void select_sort(void **a, int len, COMPAREFUNC compfunc);

void bubble_sort(void **a, int len, COMPAREFUNC compfunc);

void mysort(void **, int, COMPAREFUNC, void (*)(void**,int, COMPAREFUNC));

void print(void **a, int len);

int strcomp(void *p1, void *p2)

...{
return strcmp((char *)p1, (char *)p2);
}

int intcomp(void *p1, void *p2)

...{
return *(int*)p1-*(int*)p2;
}

void select_sort(void **a, int len, COMPAREFUNC compfunc)

...{
int i = 0;
int j = 0;
int k = 0;
void *ptmp = NULL;


for (i=0; i < len-1; i++) ...{

k=i; /**//*sentimel*/

for (j=i+1; j< len; j++) ...{

if ( compfunc(a[k],a[j]) > 0) ...{
k=j;
}
}

if ( k != i) ...{
ptmp = a[i];
a[i] = a[k];
a[k] = ptmp;
}
}
}

void bubble_sort(void **a, int len, COMPAREFUNC compfunc)

...{
int i = 0;
int j = 0;
int k = 0;
void *ptmp = NULL;


for (i=0; i < len-1; i++) ...{

k=0; /**//*sentimel*/

for (j=len-1; j>i; j--) ...{

if ( compfunc(a[j-1],a[j]) > 0) ...{
ptmp = a[j];
a[j] = a[j-1];
a[j-1] = ptmp;
k = 1;
}
}

if ( k == 0) ...{
break;
}
}
}


void mysort(void **a, int len, COMPAREFUNC compfunc, void (*method)(void**,int, COMPAREFUNC))
...{
method(a, len, compfunc);
}

void strprint(void **a, int len)

...{
int i = 0;


for (i = 0; i < len; i++) ...{
printf("%s ", (char *)a[i]);
}
}

void intprint(void **a, int len)

...{
int i = 0;


for (i = 0; i < len; i++) ...{
printf("%d ", *(int *)a[i]);
}
}

void main(void)

...{
#define N 6

char *a[N]=...{"bdd", "aaa","ffc","dee","dde", "gf"};

int c[N]=...{6,1,3,5,4,2};
int *b[N];
int i = 0;


for (i =0;i<N;i++) ...{
b[i]=&c[i];
}

strprint(a, N);
printf(" ");
mysort(a, N, strcomp, bubble_sort);
// mysort(a, N, strcomp, select_sort);
strprint(a, N);
printf(" ");
intprint(b, N);
printf(" ");
mysort(b, N, intcomp, bubble_sort);
// mysort(b, N, intcomp, select_sort);
intprint(b, N);
printf(" ");
}