二分查找(递归和非递归) C

#include<stdio.h>
#include<stdlib.h>
typedef struct List {
	int* data;
	int lenght;
	int num;
}List;
List* initList(int lenght) {
	List* L = (List*)malloc(sizeof(List));
	L->data = (int*)malloc(sizeof(int)*lenght);
	L->lenght = lenght;
	L->num = 0;
	return L;
}
void listAdd(int data,List*L) {
	L->data[L->num] = data;
	L->num = (L->num) + 1;
}
void printList(List*L) {
	for (int i = 0; i < L->num; i++)
	{
		printf("%d->",L->data[i]);
	}
	printf("NULL\n");
}
int binarySearch(int key, List* L) {
	int start = 0;
	int end = (L->num)-1;
	int mid;
	while (start<=end)
	{
		mid = (start + end) / 2;
		if (L->data[mid]<key)
		{
			start = mid + 1;
		}
		else if(L->data[mid] >key)
		{
			end = mid - 1;
		}
		else
		{
			return mid;
		}
	}
	return -1;
}
int binarySearchRecursion(int key, List* L, int start, int end) {
	if (start==end)
	{
		if (L->data[start]==key)
		{
			return start;
		}
		else
		{
			return -1;
		}
	}
	int mid = (start + end) / 2;
	if (L->data[mid]<key)
	{
		return binarySearchRecursion(key, L, mid + 1, end);
	}
	else if (L->data[mid] > key)
	{
		return binarySearchRecursion(key, L, start, mid - 1);
	}
	else
	{
		return mid;
	}

}
int main() {
	List* list = initList(9);
	listAdd(1, list);
	listAdd(2, list);
	listAdd(3, list);
	listAdd(4, list);
	listAdd(5, list);
	listAdd(6, list);
	listAdd(7, list);
	listAdd(8, list);
	listAdd(9, list);
	printList(list);
	printf("data %d in %d\n", 7, binarySearch(7, list));
	printf("data %d in %d\n", 10, binarySearch(10, list));
	printf("data %d in %d\n", 1, binarySearch(1, list));
	printf("data %d in %d\n", 3, binarySearch(3, list));
	printf("\n");
	printf("data %d in %d\n", 7, binarySearchRecursion(7, list, 0, list->num - 1));
	printf("data %d in %d\n", 10, binarySearchRecursion(10, list, 0, list->num - 1));
	printf("data %d in %d\n", 1, binarySearchRecursion(1, list, 0, list->num - 1));
	printf("data %d in %d\n", 3, binarySearchRecursion(3, list, 0, list->num - 1));
	return 0;
}

 参考:

分类: Data Structure | tyrantlucifer

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值