函数指针的应用——参数化排序规则(以冒泡排序为例)

函数是通常被封装成处理数据的功能模块,而函数指针使得函数可以在函数之间高效地进行传递。利用这函数的这个功能和函数指针的特点,可以实现对排序函数的排序规则的参数化。

下面是实现思路及代码

通常,排序函数的基本功能是实现数据按关键字递增或递减排序,所以可以封装两个功能函数:

//元素增规则
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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值