【STL】algorithm详解(swap,sort,reverse,upper_bounder etc.)

在算法考试,算法竞赛中常用的STL_algorithm

1、找出数组中最大(最小)的元素 max(x,y),min(x,y)

void max_min(){
	int Array[10] = {12,-1,34,6,999,8,1,17,67,100};
	int min_num=9999,max_num=0;
	for(int i=0;i<10;i++){
		min_num = min(min_num,Array[i]);
		max_num = max(max_num,Array[i]);
	}
	cout<<"min: "<<min_num<<endl;
	cout<<"max: "<<max_num<<endl;
} 

输出结果:
在这里插入图片描述
2、两个元素的交换swap(x,y) 在冒泡排序中可以用上

void Bubble_sort(){
	int Array[10] = {12,-1,34,6,999,8,1,17,67,100};
	int flag;
	for(int i=9;i>=0;i--){
		flag=0;
		for(int j=0;j<i;j++){
			if(Array[j]>Array[j+1]){
				flag=1;
				swap(Array[j],Array[j+1]);
			}
		}
		if(flag==0) break;
	}
	for(int i=0;i<10;i++) cout<<Array[i]<<" ";
	cout<<endl;
}

输出结果:
在这里插入图片描述
3、逆置反转reverse(Array,Array+n):将数组Array[0,n)内的元素逆置可以用于数组的循环右移上面(这里展示循环右移4个单元)

void Move_Right(){
	int Array[10] = {1,2,3,4,5,6,7,8,9,10};
	reverse(Array,Array+4);
	reverse(Array+4,Array+10);
	reverse(Array+0,Array+10);
	for(int i=0;i<10;i++) cout<<Array[i]<<" ";
	cout<<endl;
}

输出结果:
在这里插入图片描述
4、求指定数据集的全排列 next_permutation(Array,Array+3):给出一个序列在全排列中的下一个序列,若已经达到了最后一个时会返回false

void  next_permutation_test(){
	int Array[3]={1,2,3};//注意必须要一开始是有序的1,2,3才能输出全部的3!个全排列。 
	do{
		printf("%d %d %d\n",Array[0],Array[1],Array[2]);
	}while(next_permutation(Array,Array+3));
}

输出结果:
在这里插入图片描述
若需要逆序输出上面的排序结果,就需要使用该排列的前一个全排列函数为prev_permutation(Array,Array+3);使用这个函数令初始序列等于3,2,1。就可以逆序输出上面的结果。
5、fill(Array,Array+5,n):将Array中区间[Array,Array+5) 赋予值n;
6、sort(Array,Array+len,cmp) 也是最有用的排序算法,在结构体排序中经常用到。这个在这里就不赘述了。
7、 lower_bound(first,last,val)在数组的[first,last)中找第一个值大于等于val的元素的位置;
lower_bound(first,last,val)在数组的[first,last)中找第一个值大于val的元素的位置;
注意这两个函数返回的是数组元素的指针,或者容器的迭代器。(不是数组下标)。

void bound_test(){
	int Array[17] = {1,2,3,3,3,3,3,3,4,5,6,7,7,7,7,7,79};
	cout<<Array[lower_bound(Array,Array+17,3)-Array]<<" lower_bound position:"<<lower_bound(Array,Array+17,3)-Array<<endl;
	cout<<Array[upper_bound(Array,Array+17,3)-Array]<<" upper_bound position:"<<upper_bound(Array,Array+17,3)-Array<<endl;
} 

输出结果:
在这里插入图片描述
完整代码:

/*
在算法考试,算法竞赛中常用的STL_algorithm 
*/
#include
//#include
using namespace std;
//1、找出数组中最大(最小)的元素 max(x,y),min(x,y)
void max_min(){
	int Array[10] = {12,-1,34,6,999,8,1,17,67,100};
	int min_num=9999,max_num=0;
	for(int i=0;i<10;i++){
		min_num = min(min_num,Array[i]);
		max_num = max(max_num,Array[i]);
	}
	cout<<"min: "<<min_num<<endl;
	cout<<"max: "<<max_num<<endl;
} 
//2、两个元素的交换swap(x,y) 在冒泡排序中可以用上 
void Bubble_sort(){
	int Array[10] = {12,-1,34,6,999,8,1,17,67,100};
	int flag;
	for(int i=9;i>=0;i--){
		flag=0;
		for(int j=0;j<i;j++){
			if(Array[j]>Array[j+1]){
				flag=1;
				swap(Array[j],Array[j+1]);
			}
		}
		if(flag==0) break;
	}
	for(int i=0;i<10;i++) cout<<Array[i]<<" ";
	cout<<endl;
}
//3、逆置反转reverse(Array,Array+n):将数组Array[0,n)内的元素逆置
//可以用于数组的循环右移上面(这里展示循环右移4个单元)
void Move_Right(){
	int Array[10] = {1,2,3,4,5,6,7,8,9,10};
	reverse(Array,Array+4);
	reverse(Array+4,Array+10);
	reverse(Array+0,Array+10);
	for(int i=0;i<10;i++) cout<<Array[i]<<" ";
	cout<<endl;
}
//4、求指定数据集的全排列 next_permutation(Array,Array+3):给出一个序列在全排列中的下一个
//序列,若已经达到了最后一个时会返回false
void  next_permutation_test(){
	int Array[3]={1,2,3};//注意必须要一开始是有序的1,2,3才能输出全部的3!个全排列。 
	do{
		printf("%d %d %d\n",Array[0],Array[1],Array[2]);
	}while(next_permutation(Array,Array+3));
}
//5、fill(Array,Array+5,n):将Array中区间[Array,Array+5] 赋予值n;
//6、sort(Array,Array+len,cmp) 这个大家一网上搜一大堆,也是最有用的排序算法,
//在结构体排序中经常用到。这个在这里就不赘述了。 

/*
7、 lower_bound(first,last,val)在数组的[first,last)中找第一个值大于等于val的元素的位置; 
lower_bound(first,last,val)在数组的[first,last)中找第一个值大于val的元素的位置; 注意
这里返回的是数组元素的指针,或者容器的迭代器。 
*/

void bound_test(){
	int Array[17] = {1,2,3,3,3,3,3,3,4,5,6,7,7,7,7,7,79};
	cout<<Array[lower_bound(Array,Array+17,3)-Array]<<" lower_bound position:"<<lower_bound(Array,Array+17,3)-Array<<endl;
	cout<<Array[upper_bound(Array,Array+17,3)-Array]<<" upper_bound position:"<<upper_bound(Array,Array+17,3)-Array<<endl;
} 
int main(){
	max_min();
	Bubble_sort();
	Move_Right();
	next_permutation_test();
	bound_test();
}

你可能感兴趣的:(STL)