文章目录
1.排序算法介绍
STL提供的排序算法主要包含以下几个:
函数名 | 功能描述 |
---|---|
sort() | 对给定区间所有元素进行排序 |
stable_sort() | 对给定区间所有元素进行稳定排序,即保持想等元素间的相对次序 |
partial_sort() | 对给定区间所有元素部分排序 |
nth_element() | 找出给定区间的某个位置对应的元素 |
is_sorted | 判断一个区间是否已经排好序 |
- 所有的sort算法的参数都需要输入一个范围,
[begin, end)
- 使用的迭代器(iterator)都需是
随机迭代器(RadomAccessIterator)
, 也就是说可以随机访问的迭代器,(partition 和stable_partition 除外)- 可以传入自己的
比较准则(op)
,尤其是自己定义比较结构体的时候
1.1 对所有元素进行排序
经过优化的快速排序算法:
sort(begin,end)
sort(begin,end,op)
使用归并排序算法:
stable_sort(begin,end)
stable_sort(begin,end,op)
1)不带op参数的版本使用<
("小于"运算符)对区间[begin,end)内的所有元素排序
2)带op参数的版本使用op(elem1,elem2)
为准则对区间[begin,end)内的所有元素进行排序
3)sort和stable_sort()的区别的是,后者保持想等元素原来的相对次序
4)不能对list
调用这些算法,因为list不支持随机存取迭代器
1.2 局部排序
使用堆排序算法:(局部排序)
partial_sort(begin,sortEnd,end)
partial_sort(begin,sortEnd,end,op)
1)不带op参数的版本使用<
("小于"运算符)对区间[begin,end)内的元素排序,使得区间[begin,sortEnd)内的元素有序
2)带op参数的版本使用op(elem1,elem2)
为准则对区间[begin,end)内的所有元素进行排序,
3)使得区间[begin,sortEnd)内的元素有序
根据第n个位置排序(快速排序算法):
nth_element(beg,nth,end)
nth_element(beg,nth,end,op)
1)对区间[beg,end)内的元素排序,使所有在位置n之前的元素都小于等于它,所有位置在n之后的元素都大于等于它,从而得到两个分割开的子序列,但子序列不一定有序
。(和一趟快速排序一样)
2)不带op参数的使用<运算符作为排序准则
3)带op参数的使用op(elem1,elem2)作为排序准则
4)可以找到找出给定区间的第n个位置
对应的元素
1.3 自带的一些比较准则
<functional>
提供了一些比较函数,但是私认为自己写比较方便:
名称 | 功能描述 |
---|---|
equal_to<Type> | 相等 |
not_equal_to<Type> | 不相等 |
less<Type> | 小于 |
greater<Type> | 大于 |
less_equal<Type> | 小于等于 |
greater_equal<Type> | 大于等于 |
默认使用的是less,但是需要注意,这些函数并不是都适用与你的sort算法,且不能直接写入比较函数的名字,而是要写重载的()函数,比如:
less<int>()
greater<int>()
2.排序算法的常见用法
Sort函数使用模板:
头文件是#include <algorithm>
Sort(start,end,排序方法)
2.1 标准元素的排序
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
int cmp1(int a, int b) {
return a > b;
}
void showarr(int* a,int len) {
for (int i = 0; i < len; i++) cout << a[i] << " ";
cout << endl;
}
int main()
{
int a[10] = {
9,6,3,8,5,2,7,4,1,