2013-10-17 62 views
3

快速排序的內部實施被聲明爲的qsort

void qsort (void* base, size_t num, size_t size, 
      int (*compar)(const void*,const void*)); 

我想知道如何快速排序實現反射特性。我的意思是它如何調用我們傳遞的名字的函數?

+9

函數指針是語言標準中定義明確的類型,並且在那裏沒有任何反射魔法。 –

+1

沒有名字被傳遞。函數指針被傳遞。 –

+0

@Charlie - 語義問題,在引用函數方面,'name'與'symbol'同義使用是不是真的? _function我們通過的名字_似乎是一個合理的短語。 – ryyker

回答

15

qsort收到一個指向接收兩個指針並返回int函數的指針,就是這樣。這個指針被稱爲compar。所有的qsort需要做的,調用這個函數是一樣的東西:

(*compar)(base+i, base+j); 

ijbase偏移。這真的很簡單。你可以看到以K & r第二版一個可能的實現,部分5.11,第120頁:

void qsort(void *v[], int left, int right, int (*comp)(void *, void *)) { 
    int i, last; 
    void swap(void *v[], int, int); 

    if (left >= right) 
     return; 
    swap(v, left, (left + right)/2); 
    last = left; 
    for (i = left+1; i <= right; i++) 
     if ((*comp)(v[i], v[left]) < 0) /* Here's the function call */ 
      swap(v, ++last, i); 
    swap(v, left, last); 
    qsort(v, left, last-1, comp); 
    qsort(v, last+1, right, comp); 
} 
+1

引用一個引用非常好... +1 – Rerito

+2

你能解釋爲什麼'int left,int right'而不是'size_t array_size,size_t elm_size'? –

0

什麼qsort接收是起作用的指針,所以它需要的所有才能使用該功能做的是排序指針的引用。