| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2097 人关注过本帖
标题:关于快排函数 qsort
只看楼主 加入收藏
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
结帖率:87.5%
收藏
已结贴  问题点数:10 回复次数:8 
关于快排函数 qsort
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));

这里第4个参数
int (*fcmp)(const void *,const void *)
中int 后面 (*fcmp)  为什么fcmp要用括号括起来并且前面加*
2014-11-25 23:19
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
收藏
得分:0 
还有。。传递进来的a 和b 到底是什么
2014-11-25 23:20
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:10 
int (*fcmp)(const void *,const void *)是函数指针声明方式
fcmp为指向如 int funtionName(const void * a, const void * b)这一类型的函数指针
定义了一个指向函数的指针变量fcmp,它可以存放int funtionName(const void * a, const void * b) 这一类函数的入口地址,程序中把哪一个函数的入口地址赋给它,它就指向哪一个函数。
区别于 int *fcmp(cons void *,const void *)这一返回int 指针类型的 指针函数的声明
a,b为指向任意类型的指针形参,且a,b所指向的形参值不能改变。
a,b到底指向何种类型的变量,主要根据你要比较数组中什么类型变量来决定的。

qsort函数需要传入一个比较函数来进行快速排序
可以这样定义
int compare(const void *a, const void *b){
    //假设你数据结构中需要比较是int
    int temp1 = *(int *)a; //类型转换
    int temp2 = *(int *)b;
    return temp1-temp2;
}


[ 本帖最后由 liao06550107 于 2014-11-26 00:04 编辑 ]

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-25 23:38
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
收藏
得分:0 
回复 3 楼 liao06550107
我不明白的是这个 a,b  我一个数组中 a,b又大有小,我直接做差怎么能够知道返回的值是正的还是小的呢?
2014-11-26 11:53
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:0 
返回值为正,表明a所指向数据大于b所指向数据。
同理,为负,表明a所指向数据小于b所指向数据。

听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-26 13:36
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
收藏
得分:0 
回复 5 楼 liao06550107
不是啦,比如数组 1,2,3,4      函数里面 a-b   我不知道是 1 - 2 还是 2 -1   然后也就不知道返回值的正负。
2014-11-26 14:20
liao06550107
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:111
专家分:696
注 册:2011-10-2
收藏
得分:0 
你是不知道快速排序的算法思想吧!调用qsort(指向数组指针,元素个数,元素类型,compare);函数时,函数是这样运行的
设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用数组的第一个数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。一遍排序确定一个元素在有序排列中的正确位置。
一趟快速排序的算法是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;注意这里,找到第一个小于key的值A[j]是通过比较函数compare(&key,&A[j])来实现的。
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;同理,找到第一个大于key的A[i]是通过比较函数compare(&key,&A[i])来实现的
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

如果你只是想用该函数只需要知道定义函数compare(const void *a, const void *b)时
1)如果需要数组升序,那么这样定义函数:如果a比b大返回一个正值,小则负值,相等返回0。
2)如果需要数组降序,那么这样定义函数:如果a比b大返回一个负值,小则正值,相等返回0。


听不同的音乐,看不同的书,游历不同的城市,邂逅不同的人,走的多了,站的高了,自然就看的远了。
2014-11-26 16:43
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
收藏
得分:0 
回复 7 楼 liao06550107
最近几天忘了来论坛,明天再看你的回复。谢谢了!!!! 真是感谢
2014-11-28 22:51
You0
Rank: 2
等 级:论坛游民
帖 子:29
专家分:63
注 册:2014-8-2
收藏
得分:0 
很遗憾。。还是没懂,等我以后了解了,自己回来回答。。哈哈
2014-11-29 13:02
快速回复:关于快排函数 qsort
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025932 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved