`
verge
  • 浏览: 13325 次
  • 性别: 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页 *_*
分享到:
评论

相关推荐

    函数指针与指针函数应用程序

    通过阅读提供的"函数指针应用.docx"文档,你将更深入地了解如何在实际项目中使用函数指针和指针函数,包括它们的声明、赋值、传递和调用方式,以及它们在解决实际问题时的策略和技巧。文档可能还会涵盖一些高级主题...

    函数指针的使用

    函数指针可以作为其他函数的参数,这样可以实现通用算法,比如排序算法(如`qsort`)可以根据传入的比较函数来改变排序顺序。 ```cpp void sort(int arr[], int size, int (*compare)(const void*, const void*)); ...

    C语言中关于函数指针的用法

    在C语言中,函数指针是一种非常强大的特性,它允许程序员将函数当作参数传递给其他函数或在运行时决定调用哪个函数,这种灵活性对于实现某些高级算法(如排序算法中的比较函数)至关重要。下面将详细介绍函数指针的...

    回调函数就是一个通过函数指针调用的函数

    回调函数在实际中有很多应用场景,例如,在库中提供了某些排序算法的实现,如冒泡排序、快速排序、shell 排序等等,但为了使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于...

    c语言实现实现函数指针

    3. **数据结构算法**:在链表、树等数据结构的实现中,函数指针可以用于表示各种操作(如比较、排序等),使得数据结构更加通用和灵活。 4. **内存管理**:在自定义内存分配和释放函数时,可以使用函数指针来指定...

    插入排序算法c++实现

    6. **C++编程风格**:在实现过程中,遵循C++的编程规范,包括但不限于使用有意义的变量名,注释代码,遵循适当的缩进和空格规则,以及使用异常处理来捕获可能出现的错误。 7. **可读性和可维护性**:良好的代码组织...

    第8章 指针-8函数指针的典型应用-21

    在本章中,我们将探讨指针的典型应用,特别是如何使用函数指针来实现通用的排序功能。 首先,我们来看不使用函数指针时的排序实现。这里展示了两个简单的排序算法,一个是升序的选择法排序(AscendingSort),另一...

    排序算法-基于C语言实现的排序算法之InsertionSort实现.zip

    插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 插入排序的时间复杂度在最坏的情况下是O(n^...

    指向函数的指针与排序

    在上述示例中,我们将比较逻辑封装在函数指针中,使得排序算法可以根据需要进行定制,同时通过使用`void *`和适当的调整,使得算法能够处理不同类型的数据。这样的设计遵循了模块化和面向抽象的原则,提高了代码的可...

    第8章 指针-8函数指针1

    4. **算法的封装**:在需要对数据进行特定操作(如排序)时,可以将不同的算法(如冒泡排序、快速排序等)封装成函数,然后通过函数指针来选择要执行的算法,使得代码更易于扩展和维护。 总之,函数指针是C语言中...

    使用函数模板进行排序

    当我们在程序中使用`max&lt;int&gt;`或`max&lt;double&gt;`时,编译器会根据类型自动为模板生成对应的实例化函数。 对于排序,C++标准库提供了一个名为`std::sort`的函数,它就是基于模板实现的。`std::sort`可以对任何可迭代的...

    21_函数指针1

    这种设计模式在处理通用性任务时非常有用,比如事件处理、排序算法等,可以实现代码的复用和模块化。 函数指针的使用需要遵循一定的规则: 1. **定义函数指针类型**:定义函数指针类型时,要先指定返回类型,然后是...

    实验3任务要求-排序算法的实现与分析1

    5. **比较谓词**:在C++中,比较谓词是实现自定义比较规则的函数对象或函数指针,它决定了排序的标准。例如,对于`Robot`类,可以定义不同的比较方式,如按ID、Name或IQ排序。 6. **对象数组排序**:实验要求根据`...

    14章-函数指针要点

    在C语言中,许多高级数据结构如排序算法、搜索算法等都可以利用函数指针来实现通用化。例如,我们可以定义一个比较函数指针,然后将其作为参数传递给排序函数,从而实现对不同类型数据的排序。 ```c int compare...

    C++ 使用指针自然归并排序算法示例

    虽然归并排序不依赖于特定的开发环境或库,但在VC++环境中,你可以使用标准模板库(STL)的`sort`函数,但了解并实现基础排序算法对于理解计算机科学原理和优化代码性能至关重要。 **其它分类**可能意味着这个示例...

    快速排序函数代码

    在本篇文章中,我们将深入探讨一个关于快速排序算法的具体实现——通过模板函数的形式来完成排序任务。快速排序是一种高效的排序算法,在实际应用中被广泛采用。该算法的主要优点在于其速度较快,平均时间复杂度为O...

    C语言的那些小秘密之函数指针

    通过函数指针,我们可以在运行时决定调用哪个函数,这在实现回调机制、动态绑定或者算法的通用实现(如排序)等方面非常有用。 声明函数指针的语法如下: ```c return_type (*pointer_name)(parameter_list); ``` ...

    指针函数作为参数传递(经典小实例)

    指针函数在实际编程中有很多应用场景,比如排序算法中的比较函数,事件驱动编程中的回调函数,以及在数据结构和算法中的通用操作等。通过传递指针函数,我们可以实现代码的解耦和复用,让程序更加灵活和模块化。 在...

    S7-200SMART冒泡排序-优化版(可选择升序降序及数据类型等).zip

    本篇文章将深入探讨如何在S7-200SMART PLC上实现冒泡排序算法,并针对其进行优化,同时支持用户自定义升序或降序排列,以及处理不同数据类型。 首先,我们要理解冒泡排序的基本原理。冒泡排序是一种简单的排序算法...

    C语言里的通用算法介绍

    尽管C语言没有内置的模板支持,但可以通过函数指针等方式实现类似的功能。 **示例代码:** ```c typedef int (*compare_func)(int, int); int compare(int x, int y) { return x - y; } void sort(int arr[], ...

Global site tag (gtag.js) - Google Analytics