在之前的寫的排序算法裏面可以用二分搜索的方式進行優化,這篇博客就暫且先介紹一下二分搜索。後續博客會繼續對插入排序進行優化
二分搜索的算法前提:必須是已經排好序的數組。
算法:
當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);
}
總結:二分搜索算法:在搜索算法中也是很常用的搜索算法。後面的文章會把搜索算法整理一遍。