0719查詢關鍵字元:二分查詢法
阿新 • • 發佈:2019-01-29
查詢關鍵字元:
二分(折半)查詢法 (縮小區域)
前題:查詢序列是有序(降/升序)
假定:升序
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 存在