分治算法--二分搜索

一.算法簡介

有序表表示靜態查找表時,查找函數可以用二分查找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;
}



發佈了31 篇原創文章 · 獲贊 21 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章