算法总结(二分与搜索)

1.二分

注:元素必须为有序的,如果无序则需要先进行排序。

基本思想:基本思想:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。

//二分查找(折半查找)
left:表示最可能小的值

right:表示最可能大的值

int find(int x) 
{
	int left=1 , right=n ;
	while (left <= right)
	{
		int mid = left + (right - left) / 2;(等同于 (left + right) / 2,防止溢出)

   if (a[left] == x) return left; 

​		else   if (a[mid] > x) right = mid-1;
​		else left = mid + 1;
​	}

​       return -1; 
}
//二分查找,递归版本
int ef(int a[], int value, int low, int high)
{
    int mid = low+(high-low)/2;
    if(a[mid]==value)
        return mid;
    if(a[mid]>value)
        return ef(a, value, low, mid-1);
    if(a[mid]

2.搜索

广度优先搜索(BFS):

顾名思义,就是搜索的范围比较广,它运用了队列的相关知识。
就是如果有一个大山,有很多层,从山顶有很多路通往下一层,如果有一个人是从第一层开始找,找完第一层再找第二层,依次下去,这就是广度优先搜索。
如果学过数据结构中的树,则就是从树的根部开始找,先找下一层的各个结点,然后再下一层的结点,一直持续下去。
深度优先搜索(DFS):

它运用了递归的知识。

int ans = 0, n, k, a[20];
void rec(int start, int count, int sum) {
	//rec:递归英文recursion缩写
	//start:开始选数的地方
	//count:已经选了几个数
	//sum:到目前为止选的数的和


	if (count == k && prime(sum)==0) 
	{
		ans++;
		//如果已经选了k个数,判断和是不是素数
		//ans是符合条件的和的个数
	}
	
	for (int i = start; i <= n; i++) {
		//从开始选数的地方到n
		//每重循环都是一种可能性
		//例如:选第二个数,start=2,n=4,有三种可能性,调用自身3次
	
		rec(i + 1, count + 1, sum + a[i]);
	
		//参数1:从a里面下一个数开始选
		//参数2:已经选的数的个数+1
		//参数3:sum加上这次选的数
	
		//因为直接从下一个数开始选,所以不可能选到之前选过的数
		//无需判断当前的数是否被选过
	}

}


就是如果有一个大山,有很多层,从山顶有很多路通往下一层,如果有一个人是从第一层开始找了一条路开始找,一直顺着这条路找到底,再找第二条路,这就是深度优先搜索。
如果用数据结构的树来说,就是从根部开始先选择一条路去下一层的一个节点,再从该结点,选择一条路去下一个结点,慢慢深度下去,回溯上来后再从该结点选择其他结点搜索下去。

你可能感兴趣的:(算法,排序算法)