Skip to content

algorithm

algorithm 中常用函数

  • max
  • min
  • swap
  • sort
  • reverse()
  • next_permutation
  • fill()
  • lower_bound(begin,end,num)
  • upper_bound(begin,end,num)
  • unique(去重)

max

max(a,b)

获得两个数中的较大值

max 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout << "较大值是:" << max(10,100) << endl;
    return 0;
}

运行结果:

```c
较大值是:100

min

min(a,b)

获得两个数中的较小值

min 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    cout << "较小值是:" << max(10,100) << endl;
    return 0;
}

运行结果:

c
较小值是:10

swap

swap(a,b)

将 a 跟 b 的值交换

swap 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a = 10, b = 100;
	cout << "交换前,a的值是:" << a << "   "  << " b的值是: " << b << endl;
	swap(a,b);
    cout << "交换后,a的值是:" << a << "   "  << "b的值是: " << b << endl;
    return 0;
}

运行结果:

c
交换前,a的值是:10    b的值是: 100
交换后,a的值是:100   b的值是: 10

sort

sort(数组名,数组名+元素个数,排序函数);
默认按照升序排序

给数组排序

sort 示例代码
cpp
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int main()
{
    int a[5] = {11,3,7,2,9};
	sort(a,a+5);
    cout << "排序完的数组元素分别是:" << endl;
	for(int i=0;i<5;i++){
		cout << a[i] << " " ;
	}
    return 0;
}

运行结果:

c
排序完的数组元素分别是:
2 3 7 9 11

reverse()

reverse(it, it+n)可以将数组指针在[it, it+n)之间的元素或容器的迭代器在[it, it2)范围内的元素进行反转,n 表示需要反转的元素个数。

reverse 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
	cout << "反转前:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << &apos; &apos; ;
	}
	cout << endl;
	reverse(a,a+10);
	cout << "反转后:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << &apos; &apos; ;
	}
}

运行结果:

c
反转前:
0 1 2 3 4 5 6 7 8 9
反转后:
9 8 7 6 5 4 3 2 1 0

next_permutation 函数(全排列)

next_permutation(a,a+n)可以对数组指针[a,a+n]之间的元素进行全排列,也就是"n 是全排列的长度"

使用条件:排好序

next_permutation 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[3] = {1,2,3};
	do{
		for(int i=0;i<3;i++){
			cout << a[i] ;
		}
		cout << endl;
	}while(next_permutation(a,a+3))	;
    return 0;
}

运行结果:

c
123
132
213
231
312
321

fill()函数

fill(it,it+n,value)可以把数组或容器中的某一段区间赋为某个相同的值 value。

注:和 memset 不同,这里的赋值可以是数组类型对应范围中的任意值。
这里的 n 赋值的个数

fill 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[5] = {1,2,3,4,5};
    cout << "赋值前: " << endl;
    for(int i=0;i<5;i++){
    	cout << a[i] << &apos; &apos; ;
	}
	cout << endl;
	fill(a,a+5,1000);
	cout << "赋值后: " << endl;
    for(int i=0;i<5;i++){
    	cout << a[i] << &apos; &apos; ;
	}
    return 0;
}

运行结果:

c
赋值前:
1 2 3 4 5
赋值后:
1000 1000 1000 1000 1000

lower_bound(begin,end,num)函数

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

使用条件:排好序

lower_bound 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10] = {1,2,3,3,4,5,6,6,7,8};
	int id = lower_bound(a,a+10,3) - a;
    cout << "第一个大于等于3的数字下标是:" << id << endl;
    return 0;
}

运行结果:

c
第一个大于等于3的数字下标是:2

:::

upper_bound(begin,end,num)函数

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

使用条件:排好序
注意看好跟 lower_bound 的区别

upper_bound 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10] = {1,2,3,3,4,5,6,6,7,8};
	int id = upper_bound(a,a+10,3) - a;
    cout << "第一个大于3的数字下标是:" << id << endl;
    return 0;
}

运行结果:

c
第一个大于3的数字下标是:4

分析

通过 upper_bound 跟 lower_bound 的结合,我们能够很快的找到 num 出现的次数;
可以通过 upper_bound(a,a+n,num) - lower_bound(a,a+n,num);

例如:

c
int a[10] = {1,2,3,3,4,5,6,6,7,8};
int id = upper_bound(a,a+10,6) - lower_bound(a,a+10,6);
cout << "6出现的次数是:" << id << endl; //一共出现2次

unique(去重)

作用就是容器或数组去重,但是并不是完全的去重;它只是把重复的元素放在了容器的后面。

使用条件:排好序

upper_bound 示例代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[10] = {2,2,3,3,4,5,6,6,7,8};
	cout << "去重之前:" << endl;
	for(int i=0;i<10;i++){
		cout << a[i] << &apos; &apos;;
	}
	cout << endl;
	int n = unique(a,a+10) - a;
	cout << "去重之后:" << endl;
	cout << "不重复的数字个数是: " << n << endl;
	for(int i=0;i<n;i++){
		cout << a[i] <<&apos; &apos;;
	}
    return 0;
}

运行结果:

c
去重之前:
2 2 3 3 4 5 6 6 7 8
去重之后:
不重复的数字个数是: 7
2 3 4 5 6 7 8 6 7 8

分析

这里不重复的数字有 7 个,分别是 2,3,4,5,6,7,8,所以 n 的值是 7

去重后重复的数据并没有删除,只是移到了容器后面 :::

rand(随机数)

在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。

下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:

cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
   // 设置时间种子
   srand( (unsigned)time( NULL ) );
   /* 生成 5 个随机数 */
   for(int i = 1; i <= 5; i++ )
   {
      // 生成实际的随机数
      int x = rand();
      cout <<"随机数: " << x << endl;
   }
    return 0;
}

运行结果:

c
随机数: 31275
随机数: 18983
随机数: 16541
随机数: 27690
随机数: 13861

分析

这里的结果是随机的~
注意,需要加上 ctime,cstdlib 头文件

在给定区间内产生随机数
  • 借助 % 符号
cpp
#include<bits/stdc++.h>
using namespace std;
int main()
{
   // 设置时间种子
   srand( (unsigned)time( NULL ) );
   /* 生成 5 个随机数 */
   for(int i = 1; i <= 5; i++ )
   {
      // 生成1-100之间的随机数
      int x = rand() % 100 + 1;
      cout <<"随机数: " << x << endl;
   }
    return 0;
}
c
运行结果
随机数: 3
随机数: 12
随机数: 17
随机数: 15
随机数: 46

小练习