//二分查找(有序)
int binary_search(int x[], int k, int b)//本质上这里的x是一个指针(接受了地址),而不是一个数组
{
int a = 0;
int d = b - 1;//下标从零开始,所以需要减1
//int b = sizeof(x) / sizeof(x[0])-1;//数组在传参的过程中仅仅传过去数组第一个元素的地址所以不能在函数内部求数组元素的个数
//所以需在此函数外求得数组元素的个数
while (a <= d)
{
int c = (a + d) / 2;
if (x[c] < k)
a = c + 1;
else
if (x[c] > k)
d = c - 1;
else
return c;
}
if (a > d)
return -1;
}
int main()
{
int k = 7;
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int b = sizeof(a) / sizeof(a[0]);
int num = binary_search(a, k, b);
if (num == -1)
printf("找不到\n");
else
printf("找到了,下标是%d\n", num);
return 0;
}
对于无序的则应该先排序吧,排序的消耗是很大的。
其中时间复杂度为O(n)=log以2为底n的对数
(从思想入手:
对于一个数组规模为n的数组,二分查找每进行一次,就会砍一半数组个数。
则1*2*2*2*2*.......=n)