2013-05-07 272 views
0

我試圖實現一個快速排序算法,通過4種不同的標準之一來對填充了「Movie」類型的對象的數組進行排序。每個電影對象都包含排名,投票數量,評分和電影名稱。我還在類定義中編寫了4個靜態布爾函數,它接受兩個電影對象引用,如果第一個較小,則返回true;如果較大,則返回false。C++:將函數從一個函數傳遞到另一個函數

例:

bool Movie::GetLowerRank(const Movie& x, const Movie& y){ 
    if (x.rank < y.rank) 
     return true; 
    else 
     return false; 
} 

就像我說的,我想實現一個快速排序算法,將根據用戶的偏好排序的數組。我想將我的4個排序函數之一傳遞給我的快速排序函數,類似於向量排序的工作方式。我的問題是,我有兩個快速排序功能,遞歸和底座:

void quickSort(Movie array[], int min, int max, bool (*compare_function)(Movie&, Movie&)){ 
    if (min < max) { 
     int pivot_i = (min + max)/2; 
     int pivot_i2 = quickSort(array, min, max, pivot_i, compare_function); 
     quickSort(array, min, pivot_i2 - 1); 
     quickSort(array, pivot_i2 +1, max); 
    } 
} 

int quickSort(Movie array[], int min, int max, int pivot, bool (*compare_function)(Movie& a, Movie& b)){ 
    Movie pivot_entry = array[pivot]; 
    swap (array[pivot], array[max]); 
    int pivot_final_index = min; 
    for (int i = min; i < max; i++) { 
     if(compare_function(array[i], pivot_entry)){ 
      swap(array[i], array[pivot_final_index]); 
      ++pivot_final_index; 
     } 
    } 
    swap(array[max], array[pivot_final_index]); 
    return pivot_final_index; 
} 

我試圖函數參數添加到參數列表,但我無法弄清楚如何有空隙通快速排序該函數(主要獲得)到實際使用它的int quickSort。

+0

你的'void quickSort'在你嘗試調用它之前看到了你的'int quickSort'的原型嗎? – 2013-05-07 21:10:02

+0

你的GetLowerRank函數是靜態的嗎? – 2013-05-07 21:10:30

+2

您的實際功能需要兩個'常規電影&'和'quickSort'原型需要兩個'Movie&'之間存在差異。 – syam 2013-05-07 21:11:28

回答

1

首先簡化GetLowerRank

bool Movie::GetLowerRank(const Movie& x, const Movie& y) { 
    return x.rank < y.rank; 
} 

compare_function作爲最後一個參數來quickSort只是通過。由於void quickSort(...)調用int quickSort(...),當然,您必須首先聲明或定義int quickSort()。否則void quickSort()試圖調用本身會抱怨的參數號不匹配

int quickSort(Movie array[], int min, int max, int pivot, bool (*compare_function)(Movie& a, Movie& b)){ 
    Movie pivot_entry = array[pivot]; 
    swap (array[pivot], array[max]); 
    int pivot_final_index = min; 
    for (int i = min; i < max; i++) { 
     if(compare_function(array[i], pivot_entry)){ 
      swap(array[i], array[pivot_final_index]); 
      ++pivot_final_index; 
     } 
    } 
    swap(array[max], array[pivot_final_index]); 
    return pivot_final_index; 
} 

void quickSort(Movie array[], int min, int max, bool (*compare_function)(Movie&, Movie&)){ 
    if (min < max) { 
     int pivot_i = (min + max)/2; 
     int pivot_i2 = quickSort(array, min, max, pivot_i, compare_function); 
     quickSort(array, min, pivot_i2 - 1, compare_function); 
     quickSort(array, pivot_i2 +1, max, compare_function); 
    } 
} 
0

第一快速排序的遞歸調用似乎已經叫不使用函數指針:

quickSort(array, min, pivot_i2 - 1); 
    quickSort(array, pivot_i2 +1, max); 


以下代碼使用函數指針並編譯:

注:INT已經被代替的電影:

如果仍然有Movie錯誤這是一個好主意,即使 如果不是絕對必要的核實

(1) the assignment operator and 
(2) copy constructor and 
(3) equality operator 

(三個)是定義電影(你可能已經知道這一點)。

void quickSort(int array[], int min, int max, bool (*compare_function)(int&, int&)); 

int quickSort(int array[], int min, int max, int pivot, bool (*compare_function)(int& a, int& b)); 

void swap(int array[], int a, int b); 


void swap(int array[], int a, int b) { 
    int temp; 
    if (array != NULL) { 
     temp = array[a]; 
     array[a] = array[b]; 
     array[b] = temp; 

    } 

} 

void quickSort(int array[], int min, int max, bool (*compare_function)(int&, int&)){ 

    if (min < max) { 

     int pivot_i = (min + max)/2; 
     int pivot_i2 = quickSort(array, min, max, pivot_i, compare_function); 
     quickSort(array, min, pivot_i2 - 1, compare_function); 
     quickSort(array, pivot_i2 +1, max, compare_function); 
    } 
} 

int quickSort(int array[], int min, int max, int pivot, 
    bool (*compare_function)(int& a, int& b)){ 

    int pivot_entry = array[pivot]; 

    swap (array, pivot, max); 

    int pivot_final_index = min; 

    for (int i = min; i < max; i++) { 
     if(compare_function(array[i], pivot_entry)){ 
      swap(array, i, pivot_final_index); 
      ++pivot_final_index; 
     } 
    } 
    swap(array, max, pivot_final_index); 
    return pivot_final_index; 
} 
相關問題