1 #ifndef _GENERICQUICKSORT_H_2 #define _GENERICQUICKSORT_H_3 void generic_swap(void * pa, void * pb, int typeSize);4 void generic_qsort(void * pa, int elemSize, int typeSize,5 int (*cmp)(void *,void *));6 #endif
1 #include2 #include 3 #include 4 #include "generic_quick_sort.h" 5 6 static void quick_sort(); 7 void generic_swap(void * pa, void * pb, int typeSize) 8 { 9 void * ptmp = malloc(typeSize);10 memcpy(ptmp,pa,typeSize);11 memcpy(pa,pb,typeSize);12 memcpy(pb,ptmp,typeSize);13 free(ptmp);14 }15 16 void generic_qsort(void *pa, int elemSize, int typeSize,17 int (*cmp)(void *, void *))18 {19 char *paa = (char*)pa;20 quick_sort(paa,0,elemSize-1,typeSize,cmp);21 }22 23 static void quick_sort(char *paa, int beg, int end, int typeSize,24 int (*cmp)(void *, void *))25 { 26 if(beg >= end)27 return;28 int mid = (beg+end)/2;29 g_swap(paa + end * typeSize, paa + mid * typeSize, typeSize);30 char *border = paa + end * typeSize;31 int i = beg;32 int j = beg;33 for(; j < end; j++)34 {35 if(cmp(paa+j*typeSize, border) < 0){36 g_swap(paa+j*typeSize, paa+i*typeSize,typeSize);37 i++;38 }39 }40 g_swap(paa+j*typeSize, paa+i*typeSize,typeSize);41 quick_sort(paa,beg,i-1,typeSize,cmp);42 quick_sort(paa,i+1,end,typeSize,cmp);43 }
1 #include2 #include 3 #include 4 #include "generic_quick_sort.h" 5 #define PRINT_STUDENT(stu) \ 6 printf("name = %-10s, score = %-.2f\n",stu.name, stu.score) 7 8 enum {LEN=10}; 9 typedef struct student{10 char name[LEN];11 double score;12 }student;13 14 int cmp_stu(void *a, void *b);15 16 int main()17 { 18 student stu[5] = {19 { "Linda", 76.14},20 { "Angel",84.41},21 { "Jim", 98.25},22 { "Trump", 34.98},23 { "Walle", 100}24 };25 generic_qsort(&stu,5,sizeof(student),cmp_stu);26 for(int i = 0; i < 5; i++){27 PRINT_STUDENT(stu[i]);28 }29 return 0;30 }31 32 int cmp_stu(void *a, void *b)33 {34 student * pa = (student *)a;35 student * pb = (student *)b;36 if(pa->score < pb->score)37 return -1;38 else if(pa->score > pb->score)39 return 1;40 else return 0;41 }