`
verge
  • 浏览: 12910 次
  • 性别: Icon_minigender_2
最近访客 更多访客>>
社区版块
存档分类
最新评论

函数指针在通用排序算法实现中的使用 (2006-7-29)

阅读更多

指针是C语言初学者最为头疼的,然而,如果学好、用好了指针,你的程序功底就又增强了N级……

在Programing时,经常需要进行排序,如果自己写,通用性不好,也浪费时间和精力,有句话说得好:写程序就是为了不(少)写程序。其实在C标准库里已经有一个可用于所有情况的快速排序的实现函数了,我们要做的只是写一个比较函数,这里就要用到函数指针了,下面详细说明:

C标准库中快速排序函数的声明:
cpp 代码
  1. #include <stdlib.h></stdlib.h>  
  2.   
  3. void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));   
  4.   
  5. /* 对base[0], base[1], .... , base[nmemb - 1] 这nmemb个大小为size的元素,根据compar所指向的函数所定义的比较方式进行排序。   
  6. */  

在Linux的帮助页中是这样描述的:

DESCRIPTION
        The qsort() function sorts an  array with nmemb elements of  size size. The base argument points to the start of the array.

        The contents of the array are sorted in ascending order according to a comparison function pointed to by compar, which is called with two arguments that point to the objects being compared.

        The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second. If two members compare as equal, their order in the sorted array is undefined.

RETURN VALUE
        The qsort() function returns no value.


在声明void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));中的compar是一个函数指针,它指向一个带两个void *型参数且返回值为int的函数。base是要进行排序的数组的首地址;nmemb是要进行排序的元素的个数;size是数组中一个元素的大小(占用内存的字节数);compar是指向一个比较函数的函数指针。通俗地说就是对base[0], base[1], base[2], ...., base[nmemb-1]进行排序。

用法说明示例程序:

cpp 代码
  1. #include <stdio.h></stdio.h> 
  2. #include <stdlib.h></stdlib.h>
  3.   
  4. /* 比较两个指针*p1 和 *p2所指向的字符  
  5.    输入参数:p1: 要比较的第一个字符的指针;  
  6.              p2: 要比较的第二个字符的指针.  
  7.    返回值:如果第一个字符*p1的ASCII码小于第二个字符*p2的ASSCII码,返回-1;  
  8.           若等于,返回0;若大于,返回1。  
  9. */  
  10. int cmpchar(const void *ch1, const void*ch2)   
  11. {   
  12.     char* ch1 = (char*)p1;   
  13.     char* ch2 = (char*)p2;   
  14.   
  15.     if (*ch1 - *ch2 > 0)   
  16.         return 1;   
  17.     else if (*ch1 - *ch2 == 0)   
  18.         return 0;   
  19.     else  
  20.         return -1;   
  21. }   
  22.   
  23. int main(void)   
  24. {   
  25.     char str[7] = "efdcba";   
  26.   
  27.     qsort(str, 6, sizeof(char), cmpchar);   
  28.     printf("%s\n", str);   
  29.     return 0;   
  30. }   

关于函数指针的具体定义和用法请看 The C Programming Language (K & R) 第118-121页 *_*
分享到:
评论

相关推荐

    算法导论(part2)

    ·在第11.3.3节中,修改了对通用散列技术(universal hashing)的讨论,将其纳入到关于完美散列的讨论中。 ·在第12.4节中,对随机构造二叉查找树的高度,给出了一个简单得多的分析。 ·对动态规划元素的讨论(第...

    C语言通用范例开发金典.part1.rar

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.8 中序遍历二叉树(顺序结构) 169 范例1-62 中序遍历二叉树 169 ∷相关函数:InOrderTraverse函数 1.4.9 中序遍历...

    [汇编类]易语言通用型排序测试

    希尔排序:返回 假表示参数有误, 增量序列采用 2^n - 1 综合性能很不错的不稳定排序算法。其他.子程序:。文本型比较函数:注意只能支持文本型数组排序比较,其他类型 应该自己写比较函数,利用ntdll.dll的strcmp,...

    C语言通用范例开发金典.part2.rar

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...

    算法导论(part1)

    ·在第11.3.3节中,修改了对通用散列技术(universal hashing)的讨论,将其纳入到关于完美散列的讨论中。 ·在第12.4节中,对随机构造二叉查找树的高度,给出了一个简单得多的分析。 ·对动态规划元素的讨论(第...

    Modern-C-Sorting-Algorithms:广泛使用C11标准收集通用排序算法

    现代C排序算法编译中将include用作包含目录以所需的方式编译src的所有.c文件。 可以在Linux上使用src/*/*.c对其进行匹配。 哎呀! 您现在可以使用所有标头,主要是来自include/Sorts用法内置类型一些算法有一个“ G...

    C 开发金典

    ∷相关函数:Parent函数 LeftChild函数 RightChild函数 LeftSibling函数 RightSibling函数 1.4.7 双亲、孩子和兄弟节点的查询(链式结构) 162 范例1-61 双亲、孩子和兄弟节点的查询 162 ∷相关函数:Parent函数 ...

    avbc.rar_style

    在函数中进行 10个学生成绩从高到低排名, 再改进函数...编写多个不同函数,使之能实现不同的排序算法(3种以上),再编写一个通用输出函数,(要求用函数指针做参数)能分别打印不同排序算法的结果。 步骤、方法与要求

    传智播客扫地僧视频讲义源码

    07_函数重载和函数指针在一起 08_中午课程回顾 09_c++学习路线和c++基础课程学习标准_传智扫地僧 10_类的封装和访问控制 11_struct和class关键字区别 12_类的声明和类的实现分开 13_面向过程向面向对象转变案例1 14_...

    易语言程序免安装版下载

    “在库中的对应命令名”请务必准确填写静态库中公开导出的符号名称(C函数(cdecl)编译后,符号名称通常是在函数名称前加下划线(_));“在库中的对应命令名”以@开头表示以cdecl方式调用,否则表示以默认的stdcall...

    摩托罗拉C++面试题

    可以方便容易地实现搜索数据或对数据排序等一系列的算法; 调试程序时更加安全和方便; 即使是人们用STL在UNIX平台下写的代码你也可以很容易地理解(因为STL是跨平台的)。 vector实质上就是一个动态数组,会根据...

    [汇编类]易语言通用型排序测试-易语言

    希尔排序:返回 假表示参数有误, 增量序列采用 2^n - 1 综合性能很不错的不稳定排序算法。 其他.子程序: 文本型比较函数:注意只能支持文本型数组排序比较,其他类型 应该自己写比较函数,利用ntdll.dll的strcmp,...

    C语言编程精彩百例(附原书源代码)

    实例40 函数指针 实例41 指针数组 实例42 二维指针 实例43 指针的初始化 实例44 综合实例 第二篇 深入提高篇 实例45 结构体变量 实例46 结构体数组 实例47 结构体指针变量 实例48 结构体指针数组 实例49 ...

    编程新手真言......

    4.16 真正的函数指针 97 4.17 真正的句柄 97 4.18 真正的循环 98 4.19 真正的static 98 4.20 真正的数组索引 99 4.21 类型和屏看原理 100 4.22 位操作与多维数组指针与元素 101 4.23 变量与VOID 102 第5章 抽象 102 ...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    7.4.4 在构造函数中使用初始化列表 316 7.4.5 声明显式的构造函数 317 7.5 类的私有成员 318 7.5.1 访问私有类成员 320 7.5.2 类的友元函数 321 7.5.3 默认复制构造函数 323 7.6 this指针 325 7.7 类的const...

    STL入门快速入门教程-----学习C++

    C++标准函数库中80%是STL,其中广泛使用了泛性编程思想,在其中分为几大部分。 1:语言支持部分。 2:诊断部分。包含了异常处理,断言,错误代码三大方式。 3:通用工具部分。包括动态内存管理工具,日期/时间处理...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

     16.2.4 函数指针和实参推断 607  16.2.5 模板实参推断和引用 608  16.2.6 理解std::move 610  16.2.7 转发 612  16.3 重载与模板 614  16.4 可变参数模板 618  16.4.1 编写可变参数函数模板 620  16.4.2 包...

Global site tag (gtag.js) - Google Analytics