algorithm算法

sort

1 基础排序

sort(a, a + n);//对数组区间为[0,n]的数据排序
sort(a + l, a + r);//对数组区间为[l,r]的数据从小到大排序

2 更改排序顺序

STL本身提供了一些比较函数,less 小于, greater 大于, less_equal 小于等于, greater_equal大于等于

sort(a, a + n, greater<int>());//对数组a从大到小排序
sort(a, a + n, less<int>());//对数组a从小到大排序

例如

    int a[6];
    for (int i = 0; i < 5; i ++ ) a[i] = i + 3;
    
    sort(a, a + 5, greater<int>());//7 6 5 4 3 
    sort(a, a + 5, less<int>());//3 4 5 6 7

3自己编辑比较函数

#include <iostream>
#include <algorithm>

using namespace std;
//比较函数
bool cmp(int a, int b){
    
    
    return a > b;
}
int main(){
    
    
    int a[6];
    for (int i = 0; i < 5; i ++ ) a[i] = i + 3;

    sort(a, a + 5, cmp);//7 6 5 4 3     
    for (int i = 0; i < 5; i ++ ) cout << a[i] << ' ';
    
    return 0;
}

4 结构体排序

struct Node{
    
    
	int a, b, c;
}s[100];

bool cmp(Node x, Node y){
    
    
}

sort(a, a + n,cmp);

查找

1)lower_bound(a.begin(),a.end(),num);

从begin() 开始到end()-1结束,二分查找第一个大于或等于num的元素,若找到就返回该元素的下标,若没有找到,返回end().
如:
int idx = lower_bound(a + L, a + R, value) - a;
在区间[L,R)中查找,返回>=value的第一个下标

2)upper_bound(L,R,value);

第一个大于value的下标

3)equal_range()

    int a[6];
    a[0] = 1;a[1] = 2;a[2] = 3;a[3] = 4;a[4] = 4;a[5] = 5,a[6] = 6;
    int L = equal_range(a + 1, a + 5, 4).first - a;//3
    int R = equal_range(a + 1, a + 5, 4).second - a;//5

L为不破坏次序的前提下,value可插入的第一个位置
R为不破坏次序的前提下,value可插入的最后一个位置
因为[L,R)内的每一个元素都相等,所以[L,R)为value的最大区间

4)binary_search(a + L, a + R, value)

返回区间[L,R)内,二分查找是否找到元素value,找到就返回1,没找到就返回0

数组接下来的排序

常常结合do while来枚举数组排列

next_permutation(a, a + n);//产生长度为n的数组a的下一个排列
prev_permutation(a, a + n);//产生长度为n的数组a的上一个排列

猜你喜欢

转载自blog.csdn.net/qq_45914558/article/details/108627500