分治算法--二分搜索

一.算法简介

有序表表示静态查找表时,查找函数可以用二分查找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;
}



  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值