【OI】C++STL初步 排序与检索

从紫皮书过来的,但是书中内容讲的比较简洁,做一点补充笔记。


一、排序(sort函数)

头文件:<algorithm>

语法:sort(start,end,cmp);

start,end必须,cmp不必须。

参数

(1)start表示要排序数组的起始地址;
(2)end表示数组结束地址的下一位;
(3)cmp用于规定排序的方法,可不填,默认升序。
排序方法:快排时间复杂度为n*log2(n),执行效率较高。
默认情况递增排序(cmp参数为less<>())
如果要实现递减排序,cmp不缺省,填greater<数据类型>()(从大到小的意思)
对于目标数组a[n]进行升序排序,这样用:sort(a,a+n);
(理解:a是数组的第一个下标的地址,n为个数,即从头到尾。)
对于目标vector容器,使用:sort(v.begin(),v.end());
另外,如果要给自定义的数据类型排序,需要定义(重载)<运算符,并传入cmp中。

二、搜索(bound类)
切记搜索的前提是排序完的数组!!(原理是二分查找)
下面引用CSDN博主的文章:

在从小到大的排序数组中,

lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

在从大到小的排序数组中,重载lower_bound()和upper_bound()

lower_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

upper_bound( begin,end,num,greater<type>() ):从数组的begin位置到end-1位置二分查找第一个小于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。

---------------------
作者:brandong
来源:CSDN
原文:https://blog.csdn.net/qq_40160605/article/details/80150252

就lower_bound来看,他寻找的是第一个大于等于x的数,那么找不到的情况即使有返回也不一定是正确的。所以要返回头重新判断一下。

int  p = lower_bound(a,a+n,x) - a;  //此时得到下标

if (a[p] == x)  ....

大概是这样了,不全。等以后遇到再补充。

猜你喜欢

转载自www.cnblogs.com/nowonder/p/STL_search.html
今日推荐