三类基本查找算法(循环,二分,分块)

/********************************************************************
循环查找,二分法查找,分块查找
(二叉查找树(二叉排序树),哈希表查找以后碰到时在做笔记)
********************************************************************/

//顺序查找
#include <stdio.h>
int sequeceSearch(int* range,int length, int key)
{
	for(int i=0; i<length; i++)
	{
		if(range[i] == key)
			return i;	//查找成功
	}
	return -1;//查找失败
}
//二分法递归查找
int binaryFind(int* range,int left,int right, int key);
int binarySearch(int* range,int length, int key)
{
	if (range == NULL || length == 0)
		return -1;

	int left = 0;
	int right = length - 1;
	return binaryFind(range,left,right,key);
}
int binaryFind(int* range,int left,int right, int key)
{
	if(left>right)
		return -1;
	int mid = (left + right)/2;

	if(range[mid] == key)
		return mid;
	else if(range[mid] <key)
	{
		return binaryFind(range,mid+1,right,key);
	}
	else
	{
		return binaryFind(range,left,mid-1,key);
	}
}
/*
//二分法非递归查找
int binarySearch(int* range, int length, int key)
{
	if (range == NULL || length == 0)
		return -1;
	int left = 0;
	int right = length -1;
	int mid = (left + right)/2;
	while(right >= left )
	{
		if(range[mid] == key)
			return mid;
		else if(range[mid] <= key)
			left = mid + 1;
		else
			right = mid - 1;
		mid = (left+right)/2;
	}
	return -1; 
}
*/
/*
//分块查找
将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,
但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块
中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素...

step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或
顺序查找,以确定待查记录在哪一块中;
然后,在已确定的块中用顺序法进行查找。

#include <stdio.h>
struct index //定义块的结构
{
	int key;
	int start;
	int end;
} index_table[4]; //定义结构体数组
int block_search(int key, int a[]) //自定义实现分块查找
{
	int i, j;
	i = 1;
	while (i <= 3 && key > index_table[i].key) //确定在那个块中
		i++;
	if (i > 3) //大于分得的块数,则返回0
		return 0;
	j = index_table[i].start; //j等于块范围的起始值
	while (j <= index_table[i].end && a[j] != key) //在确定的块内进行查找
	j++;
	if (j > index_table[i].end) //如果大于块范围的结束值,则说明没有要查找的数,j置0
		j = 0;
	return j;
}
*/

//单元测试
void test()
{
	int arr[9] = {1,2,3,4,5,6,7,8,9};
	int k = binarySearch(arr,9,1);
	printf("%d\t",k);
	k = binarySearch(arr,9,9);
	printf("%d\t",k);
	k = binarySearch(arr,9,7);
	printf("%d\t",k);
}
int main()
{
	test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值