sort函数的排序原理

sort函数的排序原理

sort()方法的比较逻辑为:
第一轮:1和5比,1和4比,1和2比
第二轮:5和4比,5和2比
第三轮:4和2比

sort函数,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。

sort函数进行排序的时间复杂度为n*log2n(注意:不是快排===>qsort()是快排),比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include<algorithm>的c++标准库中

语法

Sort(start,end,cmp)

(1)start表示要排序数组的起始地址;

(2)end表示数组结束地址的下一位;

(3)cmp用于规定排序的方法,可不填,默认升序。

以上不是重点,重点是cmp()的书写方法:

重点

sort()方法会接受一个比较函数compare(a, b),该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。

在此函数中,a默认为在数组前面,b在数组后面;

comp函数返回一个bool类型的值,这个值表示了在严格弱排序中(可以理解为升序排序)第一参数是否位于第二个参数之前。
也就是说如果comp返回true,则第一个参数小于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之前。
如果comp返回false,则第一个参数大于第二个参数,sort根据compare的返回值将第一个参数排在第二个参数之后。

传入A,B,定义bool myfunction (int i,int j) { return (i<j); },作为comp函数,则排列AB。
传入BA,则排列AB。
可以看出是升序排列的。(sort函数默认的comp函数也是默认升序的)

而如果我们定义bool myfunction (int i,int j) { return (i>j); },作为comp函数,
传入AB,返回false,则排列为BA,
传入BA,返回true,排列为BA。
是降序排列的。

由以上解释,看下面例子:

int cmp(int a,int b)
{
    return a>b;//a-b;
}

上面中如果a>b;返回的是true,则说明a在前,b在后;

那么结果就是a,b;

如果真实情况下,a<b;则返回false,(若返回的是false,则应该转换位置)说明a应该在后,b在前;

结果就是b,a;

对于普通的数组来说:

return a>b;//从高到低
return a<b;//从低到高

不过除了以上实例,还有一些内置类型的比较;

less<数据类型 >()//从小到大排序
greater<数据类型 >()//从大到小排序

image-20210217163526652

less<>的结构体

template<class _Ty = void>
    struct less
    {    // functor for operator<
    typedef _Ty first_argument_type;
    typedef _Ty second_argument_type;
    typedef bool result_type;

    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator< to operands
        return (_Left < _Right);
        }
    };

greater的结构体

template<class _Ty = void>
    struct greater
    {    // functor for operator>
    typedef _Ty first_argument_type;
    typedef _Ty second_argument_type;
    typedef bool result_type;

    constexpr bool operator()(const _Ty& _Left, const _Ty& _Right) const
        {    // apply operator> to operands
        return (_Left > _Right);
        }
    };

ht) const
{ // apply operator> to operands
return (_Left > _Right);
}
};


看不懂没关系,知道有这种类型就可以了;




对于STL来说,

sort(a.begin(),a.end())//需要使用迭代器;

猜你喜欢

转载自blog.csdn.net/weixin_45929885/article/details/114014786