Bootstrap

布尔类型(bool) 比较器 及sort函数C/C++语言调用

一:布尔类型

1.1 在说比较器前,先说说布尔类型(bool),因为比较器需要借助布尔类型来实现。
布尔类型的变量只有两个值:true 和 false,即非真即假,一般零为假,非零为真。bool类型也可直接转为int型,即false转为0,true转为1。

bool yes = true;
bool no = flase;
int a,b;
a = yes;		//a的值为1
b = no;			//b的值为0

1.2 bool类型变量的用处:
一般在判断真假时会使用bool类型,也可以使用bool来立flag。如比较器的实现、深搜时对已搜索过的点的标记、立flag判断、调用sort函数实现降序等等。

1.3 为什么要用bool类型:
肯定也会有人像我一样想,既然完全可以用返回“0”和“1”的整型来代替true和false,那么为什么不用int型变量表示而要用bool型变量?于是我搜集了许多大神和老农的回答,讲明了原因:

1、C中有另一个惯例,函数返回0表示成功,返回非0表示错误。这样一来,如果两种风格的函数放到一起,就不容易很快的判断出来了。如果是用int表示bool的函数能直接用bool来表示返回值,那么一眼就能分辨出来了。
2、bool是个独一的类型,是会参与到函数重载解析中去的,这是将bool独立出来更有意义的原因。
3、bool可以节省空间。在做算法题的时候,有时候,用bool就可以过了。但int就不一定。字长不一样。


二、布尔型函数

2.1 布尔型函数是指函数的返回类型为布尔型变量,即为 true 或者 false

bool cmp(int a,int b)
{
	return a > b;		//若a>b则return true反之则return false
}		

三、比较器与sort函数

3.1 比较器就是借助bool型函数实现排序中的关系比较,这里主要借助sort函数说一下。(因为小白我暂时也就在sort函数中用到了比较器)
3.2 sort函数在algorithm头文件里(需声明using namespace std),是一个排序函数,sort函数有三个参数:
1:排序开始的第一个元素的地址。
2:排序结束的下一个元素的地址,通常写为开始的地址加要排序的长度。
3:比较器(此参数可省略,若省略,默认从小到大排序)
例:a数组有十个元素,从小到大排,则sort函数参数填为(a,a+10)

#include<stdio.h>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)	//比较器(加上则为降序)
{
    return a>b;			
}
int main()
{
	int a[5] = {56,4,89,67,1};
	sort(a,a+5,cmp);
	for(int i = 0;i < 5;i++)
	{
		printf("%d ",a[i]);
	}
	
	return 0;
}

3.3 若想深入了解sort函数,可以了解他的实现原理:STL中的sort并非只是普通的快速排序,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。当数据量较大时采用快速排序,分段递归。一旦分段后的数据量小于某个阀值,为避免递归调用带来过大的额外负荷,便会改用插入排序。而如果递归层次过深,有出现最坏情况的倾向,还会改用堆排序。
快速排序最关键的地方在于枢轴的选择,最坏的情况发生在分割时产生了一个空的区间,这样就完全没有达到分割的效果。STL采用的做法称为median-of-three,即取整个序列的首、尾、中央三个地方的元素,以其中值作为枢轴。具体可见快排的优化文章。
快排的优化

;