用二分搜索 來檢測職工的信息。

在之前的寫的排序算法裏面可以用二分搜索的方式進行優化,這篇博客就暫且先介紹一下二分搜索。後續博客會繼續對插入排序進行優化


二分搜索的算法前提:必須是已經排好序的數組。
算法:
在這裏插入圖片描述
當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);
}

總結:二分搜索算法:在搜索算法中也是很常用的搜索算法。後面的文章會把搜索算法整理一遍。

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