二分查找(C语言)

1.定义列表结构体

typedef struct List
{
	int *data;//数组 
	int length;//总长度 
	int num;//当前长度 
}List;

 2.初始化列表

List *initList(int length)
{/*参数length:数组总长度空间*/
	List *list = (List*)malloc(sizeof(List));//申请列表的结构体空间 
	list->data = (int*)malloc(sizeof(int)*length);//申请列表结构体内的data空间 
	list->length = length;//将总长度写入列表结构体 
	list->num = 0;//当前元素个数初始为0 
	return list;//函数指针,返回一个指针 
}

 3.向列表结构体中写入元素

void listAdd(List *list,int data)
{/*参数一:列表指针
参数二:要写入的元素*/
	list->data[list->num] = data;//把当前元素的个数作为下标,将元素写入列表结构体 
	list->num += 1;//列表结构体中当前元素个数加一 
}

 4.遍历输出

void printList(List *list)
{/*参数list:列表指针*/
	int i;
	for(i=0;i<list->num;i++)//按序输出列表中的元素 
		printf("%d ",list->data[i]);
	printf("\n");
}

 5.二分查找

int binarySearch(List *list,int key)
{/*参数一:列表指针
参数二:要查找的元素*/
	int start=0,end=list->data[list->num-1];//初始时start为0,end为数组最后一个元素的下标 
	int mid;
	int i;
	while(start<=end)
	{/*如果查找元素大于中间元素,说明查找元素可能在数组后一半内,
	此时start增加为mid+1.
	如果查找元素小于中间元素,说明查找元素可能在数组的前一半内,
	此时end减小为mid-1.
	如果相等则说明查到*/
		mid = (start+end)/2;
		if(list->data[mid]<key)
		{
			start = mid+1;
		}
		else if(list->data[mid]>key)
		{
			end = mid-1;
		}
		else
			return mid;
	}
	return -1;//全部查找完后还没找到,则返回-1 
}

 6.二分查找(递归法)

int binarySearchRecursion(List *list,int key,int start,int end)
{/*参数一:列表指针
参数二:要查找的元素
参数三:开始查找的元素下标
参数四:结束查找的元素下标*/
	if(start==end)//递归出口,start=end时说明数组查找到最后了 
	{
		if(list->data[start]==key)//最后查找的元素如果等于key,则找到元素,直接返回 
			return start;
		else
			return -1;//没有则返回-1,说明该数组中不存在key 
	}
	int mid = (start+end)/2;
	if(list->data[mid]>key)//如果查找元素小于中间元素,说明查找元素可能在数组的前一半内,此时end减小为mid-1.
		return binarySearchRecursion(list,key,start,end-1);//递归查找 
	else if(list->data[mid]<key)//如果查找元素大于中间元素,说明查找元素可能在数组后一半内,此时start增加为mid+1.
		return binarySearchRecursion(list,key,start+1,end);//递归查找 
	else
		return mid;//相等,说明找到了,直接返回该元素的下标 
}

7.主函数

int main()
{
	List *list = initList(9);//初始化定义9个元素的数组 
	int i,key;
	for(i=1;i<=9;i++)
		listAdd(list,i);//写入1-9的元素 
	printf("列表内有以下元素:\n");
	printList(list);//遍历输出列表内所有元素 
	printf("请输入要查找的元素:");
	scanf("%d",&key);
	int n;
	n = binarySearch(list,key);//非递归二分查找 
	if(n==-1)
		printf("未查找到该元素\n");
	else
		printf("查找到该元素:%d\n",list->data[n]); 
	printf("请输入要查找的元素:");
	scanf("%d",&key);
	n = binarySearchRecursion(list,key,0,list->num-1);//递归二分查找 
	if(n==-1)
		printf("未查找到该元素\n");
	else
		printf("查找到该元素:%d\n",list->data[n]); 
	return 0;
}

 完整代码:

#include <stdio.h>
#include <stdlib.h>
/*定义列表结构体*/
typedef struct List
{
	int *data;//数组 
	int length;//总长度 
	int num;//当前长度 
}List;
/*初始化列表*/
List *initList(int length)
{/*参数length:数组总长度空间*/
	List *list = (List*)malloc(sizeof(List));//申请列表的结构体空间 
	list->data = (int*)malloc(sizeof(int)*length);//申请列表结构体内的data空间 
	list->length = length;//将总长度写入列表结构体 
	list->num = 0;//当前元素个数初始为0 
	return list;//函数指针,返回一个指针 
}
/*向列表结构体中写入元素*/
void listAdd(List *list,int data)
{/*参数一:列表指针
参数二:要写入的元素*/
	list->data[list->num] = data;//把当前元素的个数作为下标,将元素写入列表结构体 
	list->num += 1;//列表结构体中当前元素个数加一 
}
/*遍历输出*/
void printList(List *list)
{/*参数list:列表指针*/
	int i;
	for(i=0;i<list->num;i++)//按序输出列表中的元素 
		printf("%d ",list->data[i]);
	printf("\n");
}
/*二分查找*/
int binarySearch(List *list,int key)
{/*参数一:列表指针
参数二:要查找的元素*/
	int start=0,end=list->data[list->num-1];//初始时start为0,end为数组最后一个元素的下标 
	int mid;
	int i;
	while(start<=end)
	{/*如果查找元素大于中间元素,说明查找元素可能在数组后一半内,
	此时start增加为mid+1.
	如果查找元素小于中间元素,说明查找元素可能在数组的前一半内,
	此时end减小为mid-1.
	如果相等则说明查到*/
		mid = (start+end)/2;
		if(list->data[mid]<key)
		{
			start = mid+1;
		}
		else if(list->data[mid]>key)
		{
			end = mid-1;
		}
		else
			return mid;
	}
	return -1;//全部查找完后还没找到,则返回-1 
}
/*二分查找(递归法)*/
int binarySearchRecursion(List *list,int key,int start,int end)
{/*参数一:列表指针
参数二:要查找的元素
参数三:开始查找的元素下标
参数四:结束查找的元素下标*/
	if(start==end)//递归出口,start=end时说明数组查找到最后了 
	{
		if(list->data[start]==key)//最后查找的元素如果等于key,则找到元素,直接返回 
			return start;
		else
			return -1;//没有则返回-1,说明该数组中不存在key 
	}
	int mid = (start+end)/2;
	if(list->data[mid]>key)//如果查找元素小于中间元素,说明查找元素可能在数组的前一半内,此时end减小为mid-1.
		return binarySearchRecursion(list,key,start,end-1);//递归查找 
	else if(list->data[mid]<key)//如果查找元素大于中间元素,说明查找元素可能在数组后一半内,此时start增加为mid+1.
		return binarySearchRecursion(list,key,start+1,end);//递归查找 
	else
		return mid;//相等,说明找到了,直接返回该元素的下标 
}
int main()
{
	List *list = initList(9);//初始化定义9个元素的数组 
	int i,key;
	for(i=1;i<=9;i++)
		listAdd(list,i);//写入1-9的元素 
	printf("列表内有以下元素:\n");
	printList(list);//遍历输出列表内所有元素 
	printf("请输入要查找的元素:");
	scanf("%d",&key);
	int n;
	n = binarySearch(list,key);//非递归二分查找 
	if(n==-1)
		printf("未查找到该元素\n");
	else
		printf("查找到该元素:%d\n",list->data[n]); 
	printf("请输入要查找的元素:");
	scanf("%d",&key);
	n = binarySearchRecursion(list,key,0,list->num-1);//递归二分查找 
	if(n==-1)
		printf("未查找到该元素\n");
	else
		printf("查找到该元素:%d\n",list->data[n]); 
	return 0;
}

 运行结果:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值