关于sort函数的cmp参数问题
此篇文章是用于解答初中OIer的问题的,目的在于讲明白传个cmp有什么用,大概率有很多错的东西
这个问题问老师的话,老师一定会说:“这个记住就行了”,因为这个问题涉及到#include 中algorithm库的源码问题。
sort函数有两种调用方法(我目前知道的)
以下就是sort的源码(algorithm库中,也就是为什么要include这个库)
void sort ( RandomAccessIterator first, RandomAccessIterator last ); //调用 sort(num,num+n)时
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);//排序区间为[first,last)
//注: 随机迭代器,能用此算法的容器是支持随机访问的容器:vector, deque, string。不支持链表一类的排序。(源码我网上找的,这个你了解一下)
这个是面向对象的重载,就是函数名一样,根据传入的参数判定调用哪个函数(了解即可)
参数Compare comp为什么能够告诉sort函数按照升序还是降序排列呢?
用冒泡排序举例(快排代码我记不住)
{
int n,a[10086];
cin>>n;
for(int i=0;i<n;i++)//输入
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n-i+1;j++)//第二层循环的次数是关键 它决定进行几轮冒泡
{
if(cmp(a[j],a[j+1]))// ********重点*********
{
swap(a[j],a[j+1]);//交换两数位置
}
}
}
for(int i=0;i<n;i++)//输出
{
cout<<a[i]<<" ";
}
return 0;
}
bool cmp(int a,int b)
{
return a>b;
}
这个cmp可以看作你传入sort中的那个参数,告诉他,在两个数比较的时候,是前面数比后面数大的时候执行交换,还是是前面数比后面数小的时候执行交换,由此达到升序和降序的效果
至于如何不靠尝试,靠推导得出sort中的cmp里写‘>’还是‘<’,因为我没有翻到全部的algorithm库源码,我只能做出如下大致猜测:
sort函数里面用的快排,[对于此快排,我令i,j为一头一尾指针],
bool cmp(int i,int j){
return i>j;
}
当 i > j 时 不执行交换 也就是
if(!cmp(a[i],a[j])){ swap (a[i],a[j])}
最终得到降序,可以暂时先这么理解,更深入的还需要涉及内存中的实例对象与数组引用问题,比如cmp()中的两个参数在sort中并不单单是两个整形,而可能是指针的偏移量。
上述内容是为了方便理解举的例子,实际的过程与我说的会有一定偏差。但原理和思想大致是这样。
说了这么多,我还是得引用老师的一句话,“关于这个问题,还是记得就行了”,啊哈哈哈
-
参考文献:
-
https://www.cnblogs.com/fighlone/p/13403738.html
-
https://blog.csdn.net/zmdsjtu/article/details/76050939