数据结构,查找算法(二分,分块,哈希)

一、查找算法

        1、二分查找:(前提条件: 必须有序的序列)

#include 
//二分查找 value代表的是被查找的值
int findByHalf(int *p, int n, int value)
{
	int low = 0;//low低
	int high = n-1;//high高
	int middle;//用来保存中间位置的下标
	while(low <= high)//注意此处循环结束的条件,需要加上 =
	{
		//不断获取中间位置的下标
		middle = (low + high) / 2;
		if(value < p[middle])//说明在前半段,移动high
		{
			high = middle-1;
		}
		else if(value > p[middle])//说明在后半段,移动low
		{
			low = middle + 1;
		}
		else//对应p[middle] == value 情况
		{
			return middle;
		}
	}
	return -1;//代表没有找到
}


int main(int argc, const char *argv[])
{
	int a[] = {12,34,56,77,89,342,567,7898};
	int i;
	for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)//把数组中的每个元素都找一遍,进行测试程序
	{
		printf("%d post is %d\n",a[i],findByHalf(a,sizeof(a)/sizeof(a[0]),a[i]));
	}
	//查找10000返回 -1
	printf("%d post is %d\n",10000,findByHalf(a,sizeof(a)/sizeof(a[0]),10000));
	return 0;
}

2、分块查找:(块间有序,块内无序)

    索引表  +  源数据表

    思路:

    (1)先在索引表中确定在哪一块中

    (2)再遍历这一块进行查找

//索引表
typedef  struct 
{
    int max; //块中最大值
    int post;//块的起始位置下标,post数组下标
}index_t; //索引
    
//源数据表
int a[19] = {18, 10, 9, 8, 16, 20, 38, 42, 19, 50, 84, 72, 56, 55, 76, 100, 90, 88, 108};
                             0                 5                   10                  15
//索引表
index_t b[4] = { {18,0},{50,5},{84,10},{108,15}};

 
 

你可能感兴趣的:(算法,数据结构,查找算法)