查詢-折半查詢(二分查詢)
阿新 • • 發佈:2019-02-09
折半查詢
折半查詢,也稱為二分查詢。其要求是資料是有序的,即表中元素按關鍵字有序。
比如有序表是遞增有序的。首先取這表中的中間的資料與關鍵值(給定值key)比較的關係。若key>表的中間值,則說明key存在於表的中間值的右側。因此,中間值右側的區間又要取出中間值再與key比較,以此類推,直至查詢成功或者區間縮小為0時還找不到就結束。
若key有與表中某區間 的中間值相等,則說明查詢成功。
若表的區間縮小為0時,仍然沒有找到與key相匹配的值,就說明key不在表中。
特點:只適合用於順序儲存結構,而不適用於鏈式儲存結構。表必須要求是有序表。
時間複雜度:
O(log2(n))
折半查詢的基本思路:
優點:效率高,平均效能好
缺點:插入刪除困難
程式碼:
(1)
#include<stdio.h> #define MAXL 10 typedef struct { int key; }NodeType; typedef NodeType SeqList[MAXL]; int BinSearch(SeqList r,int n,int k) { int left=0,right=n-1,mid; printf("\n中間值:"); while(left<=right) { mid=(left+right)/2; printf("%d ",mid); if(r[mid].key==k) { return mid; } if(r[mid].key>k) right=mid-1; else left=mid+1; } return -1; } void main() { SeqList r; int k=7; int a[10]={0,1,2,3,4,5,6,7,8,9},i,n=10; for(i=0;i<n;i++) r[i].key=a[i]; printf("關鍵字序列:"); for(i=0;i<n;i++) { printf("%d ",r[i].key); } if((i=BinSearch(r,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("元素%d不在表中\n",k); }
(2)
#include<stdio.h> int BinSearch(int arr[],int n,int k) { int left=0,right=n-1,mid; printf("\n中間值:"); while(left<=right) { mid=(left+right)/2; printf("%d ",mid); if(arr[mid]==k) { return mid; } if(arr[mid]>k) right=mid-1; else left=mid+1; } return -1; } void main() { int k=7; int a[10]={0,1,2,3,4,5,6,7,8,9},i,n=10; printf("關鍵字序列:"); for(i=0;i<n;i++) { printf("%d ",a[i]); } if((i=BinSearch(a,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("元素%d不在表中\n",k); }