您的位置首页百科知识

如何使用C++的sort和stable_sort

如何使用C++的sort和stable_sort

的有关信息介绍如下:

如何使用C++的sort和stable_sort

sort 和 stable_sort,内部实现是“快速排序”,都是C++的自带函数,提供了方便又高效的排序

那么我们该如何使用它们呢?

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

要在头文件中加上 "#include"

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

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

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

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

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

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

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

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

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

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

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

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

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

sort(首,尾,cmp)

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

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

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

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

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

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

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

如图

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

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

如图

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

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

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

该图来源于网络

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