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

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

//顺序查找
#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;
}

    原文作者:查找算法
    原文地址: https://blog.csdn.net/walkerkalr/article/details/20390559
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞