2013-08-29 2 views
0

Ниже приведены фрагменты кода родового QSort на C.Generic Quicksort

Что я пишу в четвертом параметре genmyqsort при вызове в рекурсии?

int compnode(node *a, node *b){ 
    return(strcmp(a->name,b->name)); 
} 

void genmyqsort(void *a, int n, int size, int (*fcmp)(const void*,const void*)){ 
    int pivot; 

    if(n>1){ 
    pivot=partition(a,n,size); 
    genmyqsort(a*size, pivot,size); 
    genmyqsort(a+(pivot+1)*size,n-pivot-1,size); 
    } 
} 

звонок по Qsort в основном.

genmyqsort(b,n,sizeof(node),(int(*)(const void*, const void*)) compnode); 
+0

Я думаю, вам нужно только передать указатель функции сравнения для функции распределения. – phoxis

+1

Что такое узел? Вы получаете ошибку компиляции? Вы, кажется, не используете fcmp где-либо – doctorlove

+0

прошло (int (*) (const void *, const void *)) compnode как четвертый параметр. благодаря –

ответ

2

Вы передаете тот же компаратор, как вы получили от вызывающего абонента (fcmp):

genmyqsort(a*size, pivot, size, fcmp); 
genmyqsort(a+(pivot+1)*size, n-pivot-1, size, fcmp); 

Это гарантирует, что все экземпляры genmyqsort() в дереве вызовов будут сравнивать элементы массива точно так же, ,

0

Generic быстрой сортировки записывается в виде:

#include <stdio.h> 

void Qsort(
void* sup, 
int n, 
int size, 
int(*cmp) (const void *x, const void *y), 
void (*swap) (void *a,void *b)) 
{ 
int pv = n/2, l = 0, h = n – 1; 

if (n < 2) 
return; 

while (h – 1 >= l) 
{ 
if (l == pv) 
{ 
swap((char*)sup + pv * size, (char*)sup + (pv + 1) * size); 
pv++; 
} 

if(h == pv) 
{ 
swap((char*)sup + pv * size, (char*)sup + (pv – 1) * size); 
pv–; 
} 

if (cmp((char*)sup + h * size, (char*)sup + pv * size) > 0) 
{ 
h–; 
continue; 
} 

if (cmp((char*)sup + pv * size, (char*)sup + l * size) > 0) 
{ 
l++; 
continue; 
} 

swap((char*)sup + l * size, (char*)sup + h * size); 
l++, h–; 
} 

Qsort(sup, l, size, cmp, swap); 
Qsort((char*)sup + l * size, n – l, size, cmp, swap); 
} 

int cmp(const void *c1, const void *c2) 
{ 
int a = *(const int*)c1; 
int b = *(const int*)c2; 
if (a > b) return 1; 
if (a < b) return –1; 
return 0; 
} 

void swap(void *c1, void *c2) 
{ 
int c = *(int*)c1; 
*(int*)c1 = *(int*)c2; 
*(int*)c2 = c; 
} 

void print(int* arr, int size) 
{ 
int i = 0; 
for(; i < size; ++i) 
{ 
printf(“%d \t”, arr[i]); 
} 
} 

Более подробную информацию по адресу: http://www.writeulearn.com/generic-quick-sort/