如何使用C++的sort和stable_sort

2025-10-07 02:58:01

1、sort 函数是C++自带的排序函数,期望时间复杂度是 O(nlogn),其中 n 是待排序的元素个数

要在头文件中加上 "#include<algorithm>"

图为快速排序,该图来源于网络

如何使用C++的sort和stable_sort

2、sort 的使用方法也很简单,如果将一个区间要从小到大排:

sort(区间首指针(或迭代器),区间尾指针(或迭代器));

注意这里的区间是左闭右开的,即排序的时候不会包含尾指针存储的元素

如图,这里的“a”,“a+10”就是指针

如何使用C++的sort和stable_sort

3、如果我们要排序的不是数组,而是别的 STL 容器,比如 vector

它的首迭代器就是 begin(),尾迭代器就是 end()

正巧,所有 STL 容器也是左闭右开的,所以我们就可以这么写:

sort(v.begin(),v.end());

如图,这里的“v.begin()”,“v.end()”就是迭代器

0如何使用C++STL中的vector

如何使用C++的sort和stable_sort

4、但是,没有任何“花里胡哨”的 sort 只能从小到大排序,如果我们要从大到小排序,或者更复杂,那该怎么办呢?

也很简单,你只需要写一个 cmp 函数即可

sort(首,尾,cmp)

这个 cmp 有什么用呢?你可以用它改变排序的规则

如图,当返回值为 false 时,sort 才会交换两个数

如何使用C++的sort和stable_sort

5、接下来我们详细讲解一下 cmp 函数的写法

首先,cmp 是个bool类型的函数,应包含两个和所要排序元素同类型的参数

例如待排序的元素为 int:bool cmp (int x,int y)

或者自定义的结构体 student : bool cmp (student x,student y)

接下来是排序规则,你可以想象一下,x 在 y 的左边,当 cmp 返回 true 时,不改变他们的顺序,返回 false 时,就将 x 和 y 交换

如图

如何使用C++的sort和stable_sort

6、cmp 加强版:如果有多个排序要求,按优先级一个一个写下来即可

例如我们按照“分数从高到底,分数一样按名字字典序排”

如图

如何使用C++的sort和stable_sort

1、为什么说 sort 的“期望”时间复杂度是 O(nlogn)呢?

因为 sort(快速排序) 是不稳定排序,它会改变两个关键字相同的元素的相对顺序

比如 1 1 1 1 sort 之后的 “1 1 1 1”这里面的“1”有可能就不是原来的“1”,这会增加 sort 的时间复杂度,有可能会被卡成 O(n²)

该图来源于网络

如何使用C++的sort和stable_sort

2、这时候,我们就需要“stable_sort”稳定的快速排序了,使用方法和 sort 一模一样,只不过这个函数是“stable”(稳定的)

如何使用C++的sort和stable_sort

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢