C++中排序、最值查找、二分查找、大小写转换排序的函数学习

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;

}

  • 34
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值