sort
一、sort的概念
sort算法使用的是快速排序或者类似快速排序的改进算法,具有较好的时间复杂度,一般是O(nlogn)。
二、sort的用法
在使用sort函数时需要<algorithm>头文件
sort(起始地址,结束地址的下一为,*比较函数);(”*“表示可写可不写)
int main()
{
int a[1000];
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a+n);
for (int i = 0; i < n; i++)
cout << a[i]<<' ';
return 0;
}
以此段代码为例子,sort可以将范围内的数字进行排序。
如果我们想要从开始到结束均进行排序,可将sort行写成sort(a.begin(),a.end())
不过像这样我们就只能进行升序排列,此时我们想解决这个问题就可以通过自定义比较函数来改变了,比如我们进行一个降序排列:
bool cmp(const int& u, const int& v)
{
return u > v;
}
int main()
{
int a[1000];
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n,cmp);
for (int i = 0; i < n; i++)
cout << a[i] << ' ';
return 0;
}
对于我们的自定义函数,我们采用bool类型的返回,cmp就是对应之前的可不写的位置。
如果说这个函数在整个程序中只需要使用一次的话,我们就可以考虑使用匿名函数,即没有函数名字,
我们只需要写sort函数的时候这样就行了:
sort(a,a+n,[](const &u,const &v){
return u>v});
简单而快捷。
最值查找
一、min与max函数
min(a,b),返回a,b中较小的那个值,只能传入两个值或者一个列表:
min(5,7)=5
min([1,2,3,4])=1
同理,max函数也可以类似操作
此时时间复杂度为O(1),当传入参数时数组时,时间复杂度为O(n),n为数组大小
int main()
{
int a=5;
int b = 7;
int ret=min(a, b);
cout << ret;
return 0;
}
二、min_element与max_element函数
min_element(st,ed)返回地址[st,ed)中最小的地址(迭代器),传入参数为两个地址(迭代器)
同理对于max_element函数也是类似的使用方法
int main()
{
int a[5] = { 1,2,3,4,5 };
cout << *min_element(a, a+5);
return 0;
}
代码输出的时候使用了*来解引用使之输出值,否则输出的是地址。
三、nth_element函数
nth_element(st,k,ed)是进行部分排序的,返回值为void
传入三个参数为地址或者迭代器,第二个参数的元素将处在正确的位置,其他位置可能是任意的,但是前面都比它小,后面都比它大。
时间复杂度为O(n)
int main()
{
int a[5] = { 3,4,2,7,5 };
nth_element(a, a + 2, a + 4);
for (auto& i : a)
cout << i << ' ';
return 0;
}
二分查找
一、二分查找的前提
进行二分查找的必须是数组,并且这个数组的元素必须是单调的,一般是单调不减,或者单调不增(需要改变比较函数,与sort类似)
二、binary_search函数
该函数是C++标准库中的一个算法函数,用于在已排序的序列中查找特定的元素
该函数查找特定元素是通过二分查找来实现的,比较的快捷
它会返回一个bool值来表示目标是否在序列之中
int main()
{
int str[5] = {1,2,3,4,5};
int target = 3;
bool found = binary_search(str, str+4, target);
if (found)
cout << "found";
else
cout << "not found";
return 0;
}
三、lower_bound与upper_bound函数
前提:数组必须是非降序排列,如果想使用非升序,则需要该案比较函数,与sort类似
lower_bound(st,ed,x)返回第一个大于等于元素x的元素地址
upper_bound(st,ed,x)返回第一个大于元素x的元素地址
如果不存在则返回最后一个元素的下一个位置,在vector中即end()
int main()
{
vector<int> str = { 4,2,6,3,7,4,2 };
sort(str.begin(), str.end());
for (auto i : str)
cout << i << ' ';
cout << '\n';
cout << (lower_bound(str.begin(), str.end(), 7) - str.begin());
return 0;
}
大小写转换
一、islower与isupper函数
islower函数与isupper函数在使用时都需要包括头文件<cctype>,他们分别是检验一个字符是否为小写或者大写的,其返回类型为bool
int main()
{
char a = 'a';
char b = 'B';
if (islower(a))
cout << "a为小写";
else
cout << "a为大写";
if (isupper(b))
cout << "b为大写";
else
cout << "b为小写";
return 0;
}
二、tolower与toupper函数
tolower(char ch)可以将ch转化为小写,如果ch为小写则不进行操作。
同理toupper也可以进行类似的操作
不过ch本身并不会改变,二者只是返回了改变后的大小写,就如下面的一段代码:
int main()
{
char ch1 = 'a';
char ch2 = 'b';
char ch3=tolower(ch2);
char ch4=toupper(ch1);
cout << ch1;
cout << ch2;
cout << ch3;
cout << ch4;
return 0;
}