关于指针的一个问题
比如我现在定义一个比较函数int cmp(int a,int b)return a>b;然后一个数组 int num[5]={1,4,3,5,2}
sort(num,num+5,cmp)
这样就实现了降序排列,但是具体的实现过程是怎么样的呢?
假设sort函数使用冒泡排序的方法,它是怎么利用cmp的呢?
求大佬指点一下 sort中的前两个参数决定了目标数组的长度及数据
第三个参数只是一个简单的函数指针,可以不添加,直接在函数体里面使用即可
按照冒泡排序的算法思路来写就可以了 比如我比较1,4那个cmp传入cmp的是1和4吗,
return a>b有什么用呢? 御笔剑客 发表于 2017-12-11 10:09
比如我比较1,4那个cmp传入cmp的是1和4吗,
return a>b有什么用呢?
不是,你还是要这样写cmp(1,4) BngThea 发表于 2017-12-11 16:11
不是,你还是要这样写cmp(1,4)
那我写的那个cmp有什么用呢?,它传入的a和b是谁? 御笔剑客 发表于 2017-12-11 16:27
那我写的那个cmp有什么用呢?,它传入的a和b是谁?
cmp比较两个参数的大小啊 御笔剑客 发表于 2017-12-11 16:27
那我写的那个cmp有什么用呢?,它传入的a和b是谁?
在这里没有实际用处,只是为了检测这种用法 BngThea 发表于 2017-12-11 16:45
在这里没有实际用处,只是为了检测这种用法
为什么用了cmp以后sort就变成降序排序了呢? 御笔剑客 发表于 2017-12-11 17:27
为什么用了cmp以后sort就变成降序排序了呢?
那要看你怎么用的 BngThea 发表于 2017-12-11 17:29
那要看你怎么用的
我只是想知道 sort(num,num+5,cmp)这样,假设采用冒泡排序,第一次比较的是1和4,那么传入的这个函数指针cmp在其中起了什么用呢?为什么return a>b就交换了4 和 1这两个数呢?{:10_266:} 御笔剑客 发表于 2017-12-11 17:58
我只是想知道 sort(num,num+5,cmp)这样,假设采用冒泡排序,第一次比较的是1和4,那么传入的这个函数指 ...
你代码都没给,叫人怎么分析? BngThea 发表于 2017-12-11 18:30
你代码都没给,叫人怎么分析?
#include <iostream>
#include <algorithm>
using namespace std;
int cmp(int a,int b)
{
return a>b;
}
int main()
{
int i;
int num={1,4,3,5,2};
sort(num,num+5); //升序排列
for(i=0;i<5;i++)
cout<<num<<" ";
cout<<endl;
sort(num,num+5,cmp); //传入cmp后降序排列
for(i=0;i<5;i++)
cout<<num<<" ";
return 0;
}
前两个参数给定排序的范围,cmp只是个谓词函数,用来表明这个范围内的数据要以哪种规则排列,严格意义上应该返回bool值。你自己写排序是不是这么写的if(a>b){statement}else{statement},cmp这里就是用来代替条件判断的。 先上一段代码,冒泡排序随手写的,有问题自己改一改
#include <stdio.h>
typedef int (*PFN_CMP)(void*, void*);
int cmp(void *n1, void *n2)
{
return n1 > n2 ? 1 : (n1 < n2 ? -1 : 0);
}
void sort(void **pAry, int nCount, PFN_CMP pfnCmp)
{
for (int i = 1; i < nCount - 1; i++)
{
for (int j = 0; j < nCount - i; j++)
{
if (pfnCmp(pAry, pAry) > 0)
{
void *pTmp = pAry;
pAry = pAry;
pAry = pTmp;
}
}
}
}
int main(int argc, char *argv[])
{
int num = { 1, 4, 3, 5, 2 };
sort((void**)num, sizeof(num) / sizeof(num), cmp);
for (int i = 0; i < sizeof(num) / sizeof(num); i++)
{
printf("%d\t", num);
}
return 0;
}
这个函数指针当参数,实际上在开发过程中比较常见的,这样做可以兼容各种各样的结构体(正常结构体是没办法用大于小于比较的吧),只要写一个结构体比较的函数,然后当成函数指针传进去,这个排序算法就可以复用 <(¥_$)> 发表于 2017-12-16 12:25
先上一段代码,冒泡排序随手写的,有问题自己改一改
我大概明白了,谢谢了
页:
[1]