用于C++中,对给定区间所有元素进行排序。头文件是#include
时间复杂度为n*log2(n)
Sort函数有三个参数:
Sort函数使用模板:
Sort(start,end,排序方法)
#include
#include
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<10);//第三个参数不用写(如果是从小到大排序的话)
for(int i=0;i<10;i++)
cout<return 0;
}
当从大到小排序是需要借助第三个参数进行判别
#include
#include
using namespace std;
bool compare(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<//从大到小排序
sort(a,a+10,compare);//在这里就不需要对compare函数传入参数了,
//这是规则
for(int i=0;i<10;i++)
cout<return 0;
}
equal_to、not_equal_to、greater、greater_equal、less、less_equal
greater ()
从大到小排序,less ()
从小到大排序。编写运算符重载函数
<返回类型说明符> operator <运算符符号>(<参数表>)
{
<函数体>
}
对于这种方法,一般应用于自定义数据类型,因为sort排序函数是应用
<实现功能的。
程序举例:
struct Test
{
int mem1;
int mem2;
bool operator< (const Test t)
{
return this->mem1
定义外部比较类:
struct Less
{
bool operator()(const Student& s1, const Student& s2)
{
return s1.name < s2.name; //从小到大排序
}
};
std::sort(sutVector.begin(), stuVector.end(), Less());
STL提供了两种调用方式,一种是使用默认的<操作符比较,一种可以自定义比较函数。
实现原理:
STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
普通的快速排序可以叙述如下,假设S代表需要被排序的数据序列:
快速排序最关键的地方在于枢轴的选择,最坏的情况发生在分割时产生了一个空的区间,这样就完全没有达到分割的效果。STL采用的做法称为median-of-three,即取整个序列的首、尾、中央三个地方的元素,以其中值作为枢轴。
分割的方法通常采用两个迭代器head和tail,head从头端往尾端移动,tail从尾端往头端移动,当head遇到大于等于pivot的元素就停下来,tail遇到小于等于pivot的元素也停下来,若head迭代器仍然小于tail迭代器,即两者没有交叉,则互换元素,然后继续进行相同的动作,向中间逼近,直到两个迭代器交叉,结束一次分割。
看一张来自维基百科上关于快速排序的动态图片,帮助理解。
快速排序的口诀:
东拆西补,西拆东补,一边拆一边补,递归完成所有过程
对元素5的两边的元素也重复以上操作,直到元素达到有序状态