2013-05-07 131 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; 
} 
相关问题