用二分搜索 来检测职工的信息。

在之前的写的排序算法里面可以用二分搜索的方式进行优化,这篇博客就暂且先介绍一下二分搜索。后续博客会继续对插入排序进行优化


二分搜索的算法前提:必须是已经排好序的数组。
算法:
在这里插入图片描述
当begin == end时候,代表没找到对应的数字
在这里插入图片描述


下面以一个案例为例,来解决一个小案例:
实现查找职工信息:
(1)输入10个职工的姓名和职工号;
(2)按职工号由小到大排序,姓名顺序也随之调整;
(3)要求输入一个职工号,用 二分查找(折半查找)法找出该职工的姓名。从主函数输入要查找的职工号,输出该职工姓名。


在这里插入代码片

定义职工结构体

typedef struct Student
{
	char name[32];
	int id;
}Student;

排序(采用的是冒泡排序,已经经过优化,在前面的排序(1)-冒泡排序详细说过冒泡的排序)

void sort(Student arr[],int len)
{
	if(arr == NULL || len < 2)
	{
		return;
	}

	int begin = 0;
	int end = 0;

	for(end = len -1;end > 0;end--)
	{
		int flag = 1;
		for(begin = 1;begin < end;begin++)
		{
			if(arr[begin].id < arr[begin -1].id)
			{
				Student tmp = arr[begin];
				arr[begin] = arr[begin-1];
				arr[begin-1] = tmp;
				flag = 0;
			}
		}

		if(flag == 1)
		{
			break;
		}
	}

}

二分查找

int BinarySearch(Student arr[],int len,int *id)
{
	if(arr == NULL || len == 0)
	{
		return -1;
	}

	int begin = 0;
	int end = len;

	while(begin < end)
	{
		int mid = (begin + end) >> 1;
		if(*id < arr[mid].id)
		{
			end = mid;
		}
		else if(*id > arr[mid].id)
		{
			begin = mid + 1;
		}
		else
		{
			*id = mid;
			return *id;
		}
	}
	//退出while循环,begin == end,没找到。
	return -1;
}

测试程序:

void test03()
{
	srand((unsigned int)time(NULL));
	Student arr[10];
	int len = sizeof(arr)/sizeof(arr[0]);

	int i = 0;
	char tmpname[32];
	for(i = 0;i<len;i++)
	{
		printf("input %dst name:",i+1);
		scanf("%s",tmpname);
		strcpy(arr[i].name,tmpname);
		arr[i].id = rand()%99+1;
	}

	printf("before sort:\n");
	for(i = 0;i<len;i++)
	{
		printf("%s\t%d\n",arr[i].name,arr[i].id);
	}

	//排序
	sort(arr,len);

	printf("\nafter sort:\n");
	for(i = 0;i<len;i++)
	{
		printf("%s\t%d\n",arr[i].name,arr[i].id);
	}

	//查找对应的id.
	int tid = 0;
	printf("please input search person's id:");
	scanf("%d",&tid);

	BinarySearch(arr,len,&tid);

	printf("%s\t%d\n",arr[tid].name,arr[tid].id);
}

总结:二分搜索算法:在搜索算法中也是很常用的搜索算法。后面的文章会把搜索算法整理一遍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章