C++中STL算法之排序算法——sort

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,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值