函数是通常被封装成处理数据的功能模块,而函数指针使得函数可以在函数之间高效地进行传递。利用这函数的这个功能和函数指针的特点,可以实现对排序函数的排序规则的参数化。
下面是实现思路及代码
通常,排序函数的基本功能是实现数据按关键字递增或递减排序,所以可以封装两个功能函数:
//元素增规则
bool less_than(int a, int b)
{
return (a < b);
}
//元素递减规则
bool greater_than(int a, int b)
{
return (a > b);
}
参数化排序函数的排序规则:
//冒泡排序用到的思想:比较、区间划分、增量
void bubble_sort(int *arr, int n, bool (*fp) (int, int))
{
int i, j;
bool exchange;
for (i = 0; i < n-1; i++)
{
exchange = false;
for (j = n-1; j > i; j--)
if (fp(*(arr+j), *(arr+j-1)))
{
swap(arr, j, j-1);
exchange = true;
}
if (!exchange)
return ;
}
}
ps:以上是改进版的排序算法——如果一趟排序后没有进行元素交换,则说明元素已正序,排序结束。
有了以上的函数定义,就可以在需要元素递增排序时,传less_than函数的指针,在需要元素递减排序时,传greater_than函数的指针,消除了对修改函数源码的琐碎。
时间复杂度分析:排序趟数与问题规模n有关,而每一趟的比较次数又与无序区的规模有关,很显然平均时间复杂度为 O ( n 2 ) O(n^2) O(n2),exchange的判断功能对函数在某些情况下的性能会有所提高,但一般认为不影响平均时间复杂度
空间复杂度分析:算法所用的临时变量与问题规模无关,即是一个就地排序算法,所以空间复杂度为 O ( 1 ) O(1) O(1)