1. 程式人生 > >0719查詢關鍵字元:二分查詢法

0719查詢關鍵字元:二分查詢法

查詢關鍵字元:

二分(折半)查詢法  (縮小區域)
     前題:查詢序列是有序(降/升序)  
     假定:升序
      1、每次取序列中間元素進行比較
      2、如果key>mid,說明查詢值在中間元素的右側,
           如果key<mid,說明查詢值在中間元素的左側,
                 key==mid,說明查詢成功
     3、如果查詢不成功,則再重複1,2步驟,直到查詢成功或失敗 

#include<stdio.h>
void main()
{
	int buf[]={1,2,3,4,5,6,7,8,9,10,11};	//10
//                 l         m          r
//                 	       l   m	r
//                 	             ml  r
//折半查詢:                         
	int mid,left=0,right=10;
	int key=10;//需要在序列查詢2是否存在
	//從區間中獲取中間元素的下標
	while(left<=right)
	{
		mid=(left+right)/2;    
		if(key<buf[mid])	    //條件成立 輸出 查詢值在右側
		{
			right=mid-1;
			printf("左側\n");
		}
		else if(key>buf[mid])    //條件成立 查詢值在右側
		{
			left=mid+1;	
			printf("右側\n");
		}
		else if(key==buf[mid])    //條件成立 
		{
			printf("查詢成功,在第%d個元素\n",mid+1);
			break;//跳出迴圈
		}
	}
}

 

二分法指標實現

#include<stdio.h>

void main()
{
//陣列:
	int buf[10]={1,2,3,4,5,6,7,8,9,10};
//	             L       M          R
//	             L     R	       		  
//二分法(折半查詢):
//1、確定左右區域並指現中間值
//2、key>mid  右側  key<mid  左側
	int* left=buf,*right=buf+9,*mid=NULL;//設定地址為0的指標為空指標(不指向任何的元素)
	int key=23;
	while(left<=right)//
	{
		mid=left+(right-left)/2;
		if(key>*mid)//右側
		{
			left=mid+1;
		}
		else if (key==*mid)//成功
		{
			printf("查詢成功:%d\n",*mid);
			break;
		}
		else//左側
		{
			right=mid-1;
		}
	}

key= 23 不存在 請按任意鍵繼續

key=3 存在