1. 程式人生 > >二分法查詢(折半查詢)

二分法查詢(折半查詢)

一、二分法查詢思想

  1. 首先從陣列的中間mid開始查詢,如果剛好等於要查詢的值,則返回這個數字的所在位置。
  2. 如果要查詢的數字比mid值小,則讓mid-1,做為陣列的右邊界,重複(1)操做;如果要查詢的數字比mid大,則讓mid+1做為陣列的左邊界,重複(1)操作。
  3. 如果left=right時,還沒有找到該數字,則此數字不存在於這個陣列當中。

如圖:

二、二分法查詢的前提條件

  • 必須是順序表
  • 順序表中的數字必須有序

三、程式碼實現

第一種:非遞迴實現 時間複雜度為O(log2^n)

#include<stdio.h>
int Searchval(int *arr,int n,int val)
{
  int pos=-1;
  if(arr==NULL||n<=0)

  {
    return pos;
  }
  int left=0;right=n-1;
  while(right>=left)
  {
    int mid=(right-left)/2+left;防止溢位
    if(arr[mid]>val)
    {

      right=mid-1;
    }

    else if(arr[mid]<val)

    {
      left=mid+1;
    }
    else
    {
      while(right>left&&val=arr[mid-1]) mid--;
      break;
    }
  }
  return pos;
}
int main()
{
	int arr[]={0,0,1,2,2,3,4,5,6,7,8,9};
	int n=sizeof(arr)/sizeof(arr[0]);
	int pos=FindVal(arr,n,7);
	printf("%d\n",pos);
	return 0;
}

第二種:遞迴演算法

#include<stdio.h>

int Search(int *arr,int left,int right,int val)
{
  int pos=-1;
  if(right>=left)
  {
    int mid=(right-left)/2+left;
    if(val>arr[mid])
    {
      pos=Search(arr,mid+1,right,val);   
    }
    else if(val<arr[mid])
    {
      pos=(arr,left,mid-1,val);
    }
    else
    {
       while(mid>left&&val=arr[mid-1]) --mid;
       pos=mid;
    }
  }
  return pos;
}
int SearchVal(int *arr,int n,int val)
{
  int pos=-1;
  if(arr==NULL||n<=0) return pos;
  return SearchVal(arr,0,n-1,val);
}

int main()
{
  int arr[]={0,0,1,2,2,3,4,5,6,7,8,9};
  int n=sizeof(arr)/sizeof(arr[0]);
  int pos=SearchVal(arr,n,2);
  printf("%d\n",pos);
  return 0;
}