2013-05-07 4 views
0

Я пытаюсь реализовать алгоритм быстрой сортировки для сортировки массива, заполненного объектами типа «Фильм» одним из 4-х разных критериев. Каждый объект фильма содержит рейтинг, количество голосов, рейтинг и название фильма. Я также написал 4 статические функции bool в определении класса, которые берут две ссылки на объект фильма и возвращают true, если первый меньше, или возвращает false, если он больше.C++: Передача функции от одной функции к другой

Ex:

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

Как я сказал, что я пытаюсь реализовать алгоритм быстрой сортировки, который будет сортировать массив на основе предпочтений пользователя. Я хочу передать одну из моих 4 функций сортировки моей функции quicksort, подобно тому, как работает сортировка векторов. Моя проблема заключается в том, что у меня есть две QuickSort функции, рекурсивная и основание:

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; 
} 

Я пытался добавить параметр функции в списке параметров, но я не могу понять, как иметь пустот QuickSort проход функция (которая получается в основном) для int quickSort, которая фактически использует ее.

+0

Ваш 'void quickSort' видел прототип для вашего' int quickSort', прежде чем он попытается называть его? –

+0

Является ли ваша функция GetLowerRank статической? –

+2

Существует некоторая разница между вашей фактической функцией, которая принимает два 'const Movie &' и прототипы 'quickSort', которые берут два' Movie & '. – syam

ответ

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, по всей видимости, были вызваны без использования функции указателя:

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


Приведенный ниже код использует указатели функций и составляет:

Примечание: ИНТ был заменен на фильм:

Если есть еще ошибка с 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; 
} 
Смежные вопросы