一.算法簡介
以有序表表示靜態查找表時,查找函數可以用二分查找(binary search or half-intervalsearch )來實現。這種算法基於分治。https://en.wikipedia.org/wiki/Binary_search_algorithm
二.複雜度分析
二分查找的時間複雜度是O(log(n)),最壞情況下的時間複雜度是O(n)。
三.算法思想及步驟
二分查找(binary search or half-interval search )的查找過程是:先確定待查記錄所在的區間,然後逐步縮小區間直到找到或找不到該記錄爲止。
假設 low 指向區間下界,high 指向區間上界,mid 指向區間的中間位置,則 mid = (low + high) / 2;
具體過程:
1.先將關鍵字與 mid 指向的元素比較,如果相等則返回mid。
2.關鍵字小於 mid 指向的元素關鍵字,則在 [ low, mid-1 ]區間中繼續進行二分查找。
3.關鍵字大於mid 指向的元素關鍵字,則在[ mid +1 ,high] 區間中繼續進行二分查找。
僞碼如下
遞歸Recursive
int binary_search(int A[], int key, int imin, int imax)
{
// test if array is empty
if (imax < imin)
// set is empty, so return value showing not found
return KEY_NOT_FOUND;
else
{
// calculate midpoint to cut set in half
int imid = midpoint(imin, imax);
// three-way comparison
if (A[imid] > key)
// key is in lower subset
return binary_search(A, key, imin, imid - 1);
else if (A[imid] < key)
// key is in upper subset
return binary_search(A, key, imid + 1, imax);
else
// key has been found
return imid;
}
}
迭代Iterative
int binary_search(int A[], int key, int imin, int imax)
{
// continue searching while [imin,imax] is not empty
while (imax >= imin)
{
// calculate the midpoint for roughly equal partition
int imid = midpoint(imin, imax);
if(A[imid] == key)
// key found at index imid
return imid;
// determine which subarray to search
else if (A[imid] < key)
// change min index to search upper subarray
imin = imid + 1;
else
// change max index to search lower subarray
imax = imid - 1;
}
// key was not found
return KEY_NOT_FOUND;
}
四.C代碼
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;
}
int binery_search(int *a,int aim,int l,int r)
{
int mid,low,up;
int i;
low=l;up=r;
while(low<=up)
{
mid=(low+up+1)/2;
if(a[mid]==aim)
return mid;
else if(a[mid]>aim)
{
up=mid-1;
}
else if(a[mid]<aim)
{
low=mid+1;
}
}
}
int main()
{
int a[20];
int aim,item;
int i;
for(i=0;i<20;i++)
scanf("%d",&a[i]);
qsort(a,20,sizeof(int),cmp);
scanf("%d",&aim);
item=fun(a,aim,0,19);
for(i=0;i<20;i++)
printf("%d ",a[i]);
puts("");
printf("item->%d\taim->%d\n",item,aim);
return 0;
}