2013-08-29 143 views
0

下面是通用的qsort對C.通用快速排序

代碼片段我怎麼在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

通用快速排序寫爲:在

#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/