御笔剑客 发表于 2017-12-11 09:46:03

关于指针的一个问题

比如我现在定义一个比较函数int cmp(int a,int b)return a>b;
然后一个数组 int num[5]={1,4,3,5,2}
sort(num,num+5,cmp)
这样就实现了降序排列,但是具体的实现过程是怎么样的呢?
假设sort函数使用冒泡排序的方法,它是怎么利用cmp的呢?
求大佬指点一下

BngThea 发表于 2017-12-11 09:55:32

sort中的前两个参数决定了目标数组的长度及数据
第三个参数只是一个简单的函数指针,可以不添加,直接在函数体里面使用即可
按照冒泡排序的算法思路来写就可以了

御笔剑客 发表于 2017-12-11 10:09:10

比如我比较1,4那个cmp传入cmp的是1和4吗,
return a>b有什么用呢?

BngThea 发表于 2017-12-11 16:11:48

御笔剑客 发表于 2017-12-11 10:09
比如我比较1,4那个cmp传入cmp的是1和4吗,
return a>b有什么用呢?

不是,你还是要这样写cmp(1,4)

御笔剑客 发表于 2017-12-11 16:27:29

BngThea 发表于 2017-12-11 16:11
不是,你还是要这样写cmp(1,4)

那我写的那个cmp有什么用呢?,它传入的a和b是谁?

wjp 发表于 2017-12-11 16:45:09

御笔剑客 发表于 2017-12-11 16:27
那我写的那个cmp有什么用呢?,它传入的a和b是谁?

cmp比较两个参数的大小啊

BngThea 发表于 2017-12-11 16:45:56

御笔剑客 发表于 2017-12-11 16:27
那我写的那个cmp有什么用呢?,它传入的a和b是谁?

在这里没有实际用处,只是为了检测这种用法

御笔剑客 发表于 2017-12-11 17:27:14

BngThea 发表于 2017-12-11 16:45
在这里没有实际用处,只是为了检测这种用法

为什么用了cmp以后sort就变成降序排序了呢?

BngThea 发表于 2017-12-11 17:29:23

御笔剑客 发表于 2017-12-11 17:27
为什么用了cmp以后sort就变成降序排序了呢?

那要看你怎么用的

御笔剑客 发表于 2017-12-11 17:58:17

BngThea 发表于 2017-12-11 17:29
那要看你怎么用的

我只是想知道 sort(num,num+5,cmp)这样,假设采用冒泡排序,第一次比较的是1和4,那么传入的这个函数指针cmp在其中起了什么用呢?为什么return a>b就交换了4 和 1这两个数呢?{:10_266:}

BngThea 发表于 2017-12-11 18:30:24

御笔剑客 发表于 2017-12-11 17:58
我只是想知道 sort(num,num+5,cmp)这样,假设采用冒泡排序,第一次比较的是1和4,那么传入的这个函数指 ...

你代码都没给,叫人怎么分析?

御笔剑客 发表于 2017-12-11 20:36:34

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;

}

luckstudent 发表于 2017-12-11 21:47:36

前两个参数给定排序的范围,cmp只是个谓词函数,用来表明这个范围内的数据要以哪种规则排列,严格意义上应该返回bool值。你自己写排序是不是这么写的if(a>b){statement}else{statement},cmp这里就是用来代替条件判断的。

<(¥_$)> 发表于 2017-12-16 12:25:04

先上一段代码,冒泡排序随手写的,有问题自己改一改

#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:52:11

<(¥_$)> 发表于 2017-12-16 12:25
先上一段代码,冒泡排序随手写的,有问题自己改一改




我大概明白了,谢谢了
页: [1]
查看完整版本: 关于指针的一个问题