二分查找算法

二分查找又称折半查找,只适用于已经排序好的顺序表。


结构体的定义

typedef struct 
{//查找表的数据结构
	int data[maxsize];//静态数组
	int TableLen;//表长
}SSTable;

定义一个顺序数组和表长数据

初始化表

int InitTable(SSTable& L, int i) //顺序输入i
{
	int j;
	L.TableLen = 0;
	for (j = 0; j < i; j++) 
	{
		L.data[j] = 2 * j + 1;
		L.TableLen++;
		printf("%d ", L.data[j]);
	}
	printf("\n表长:%d", L.TableLen);
	return 1;
}

顺序输入值2*i+1

二分查找

int TableSearch(SSTable L,int key)
{
	int low = 0, high = L.TableLen - 1,mid=0;//定义两个指针,分别指向表头表尾
	while (high >= low) 
	{
		mid = (low + high) / 2;
		if (key == L.data[mid]) 
		{
			printf("找到了在数组下标%d的位置上\n", mid);
			break;
		}
		else if (key > L.data[mid]) 
			low = mid + 1;
		else 
			high = mid - 1;
	}
	if (low > high)printf("查找失败");
	return -1;
}

首先将要查找的值传入,然后定义一个头指针和尾指针分别指向队头和队尾。当high>=low,使mid的high与low的和除2向下取整,判断若key正好等于数组中下标为mid的元素则查找成功。若key大于当前的数据则将mid+1赋值给low,若key小于当前数据则将mid-1赋值给high,再次判断high是否>=low,若满足则继续寻找。若high<low,则退出循环说明寻找失败。

全部代码

#include<stdio.h>
#include<stdlib.h>
#define maxsize 10
#define initsize 10
#pragma warning(disable:4996)
#pragma warning(disable:5208)

//二分查找(只适用于排序好的表)
typedef struct 
{//查找表的数据结构
	int data[maxsize];//静态数组
	int TableLen;//表长
}SSTable;

//初始化
int InitTable(SSTable& L, int i) //顺序输入i
{
	int j;
	L.TableLen = 0;
	for (j = 0; j < i; j++) 
	{
		L.data[j] = 2 * j + 1;
		L.TableLen++;
		printf("%d ", L.data[j]);
	}
	printf("\n表长:%d", L.TableLen);
	return 1;
}

//二分查找
int TableSearch(SSTable L,int key)
{
	int low = 0, high = L.TableLen - 1,mid=0;//定义两个指针,分别指向表头表尾
	while (high >= low) 
	{
		mid = (low + high) / 2;
		if (key == L.data[mid]) 
		{
			printf("找到了在数组下标%d的位置上\n", mid);
			break;
		}
		else if (key > L.data[mid]) 
			low = mid + 1;
		else 
			high = mid - 1;
	}
	if (low > high)printf("查找失败");
	return -1;
}

int main() 
{
	SSTable L;
	int i=10, e;
	printf("输入的结果是:");
	InitTable(L, i);
	printf("请输入:");
	scanf("%d", &e);
	TableSearch(L, e);
	return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值