在之前的写的排序算法里面可以用二分搜索的方式进行优化,这篇博客就暂且先介绍一下二分搜索。后续博客会继续对插入排序进行优化
二分搜索的算法前提:必须是已经排好序的数组。
算法:
当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);
}
总结:二分搜索算法:在搜索算法中也是很常用的搜索算法。后面的文章会把搜索算法整理一遍。