函数指针实例:使用冒泡排序模拟实现qsort的功能
2018-01-08 09:56
477 查看
qsort简介
qsort是函数库提供给我们的一种使用快速排序来实现各种类型数据排序的函数功 能: 使用快速排序例程进行排序
头文件:stdlib.h或search.h
用 法:
_CRTIMP void __cdecl qsort(void*, size_t, size_t,int (*)(const void*, const void*));
参数解释:
1 待排序数组首地址
2 数组中待排序元素数量
3 各元素的占用空间大小
4 指向函数的指针,用于确定排序的顺序
回调函数
qsort原型中有传入函数指针int (*)(const void*, const void*),而这个函数需要用户自行编写,这种通过传入函数指针的方式,在代码内通过该指针来调用函数的方式叫做回调函数
模拟原理
qsort可以对任意同类型的数据进行排序,因为该函数对数据的操作是通过字节操作的,所以需要传入的参数中有数据个数和数据长度,方便数据逐字节操作。当然,因为是通过字节操作,代码其中充斥了大量的强制类型转换
之所以实现该代码,是为了通过模拟实现qsort来加深对函数指针的理解
实现代码
代码github地址#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <windows.h> #include <search.h> #include <stdlib.h> #include <assert.h> void my_sort(void* base, size_t count, size_t size, int(*cmp)(const void* elem1, const void* elem2)); void swap(void* data1, void* data2, size_t size);//辅助my_sort函数 int float_cmp(const void* elem1, const void* elem2); int int_cmp(const void* elem1, const void* elem2); int str_cmp(const void* elem1, const void* elem2); int main() { int i = 0; int arr[] = { 9,5,6,7,8,1,3,6,4,3 }; int size = sizeof(arr) / sizeof(arr[0]); //qsort(arr, size, sizeof(int), int_cmp); my_sort(arr, size, sizeof(int), int_cmp);//使用和qosrt一样的参数 for (i = 0; i < size; i++) { printf("%d ", arr[i]); } printf("\n"); system("pause"); return 0; } void my_sort(void* base, size_t count, size_t size, int(*cmp)(const void* elem1, const void* elem2)) { assert(base);//传入参数要确保base和cmp不为空 assert(cmp); unsigned int i = 0; while ((count--) - 1)//冒泡排序,count个参数就排序count-1 { for (i = 0; i < count; i++) { if (cmp((char*)base + size * i, (char*)base + (i + 1) * size))//比较函数,需要用户做自己编写 { swap((char*)base + size * i, (char*)base + (i + 1) * size, size);//交换函数 } } } } static void swap(void* data1, void* data2, size_t size) { int i = 0; while(size--)//按字节交换数据 { char tmp = *(char*)data1; *(char*)data1 = *(char*)data2; *(char*)data2 = tmp; (char*)data1 = (char*)data1 + 1; (char*)data2 = (char*)data2 + 1; } } int int_cmp(const void* elem1, const void* elem2)//自行编写比较函数 { return *(int*)elem1 > *(int*)elem2; } int float_cmp(const void* elem1, const void* elem2) { return *(float*)elem1 > *(float*)elem2; } int str_cmp(const void* elem1, const void* elem2) { return strcmp((char*)elem1 ,(char*)elem2); }
相关文章推荐
- JXCELL实例学习与研究(六) 之 sheet的分页功能的实现,以及基本EXCEL公式的使用 以及补充函数说明
- 在SQL SERVER中实现Split功能的函数,并在存储过程中使用
- 使用Java程序实现随机验证码功能的实例
- 使用Oracle函数实现按汉字拼音首字母查询功能
- C++语言实现指向函数的指针数组实例
- ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
- 使用php 的缓冲区功能和apache的url重写功能实现静态html生成实例
- 使用Java程序实现随机验证码功能的实例
- qsort实现原理与应用 指向函数的指针
- what's in string? c语言string类函数实现汇总 觉得都是学习使用指针的好例子(算是读书摘抄和笔记吧)
- 用最简单的函数实现功能:判断一个int数据是否是2的x次幂(不能使用循环)。
- 使用tr1::function和tr1::bind实现类的非静态成员函数指针
- 使用php 的缓冲区功能和apache的url重写功能实现静态html生成实例
- 在SQL SERVER中实现Split功能的函数,并在存储过程中使用
- 约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
- java中实现类似函数指针的功能
- Jsp开发中使用Cookie实例(实现记住密码功能)
- APUE习题[实现dup2函数功能,不使用fcntl]
- what's in string? c语言string类函数实现汇总 都是学习使用指针的好例子啊(算是读书摘抄和笔记吧)
- 有效的使用和设计COM智能指针——条款3:按照功能和实现原理选择合适的智能指针