二分查找又稱折半查找,前提要求數據序列呈現線性結構,即必須是經過排序的。
基本思路:
在一組有序序列中,取中間值與給定關鍵字進行比較,如果給定關鍵字大於該值關鍵字,則要查找的關鍵字位於有序序列的后半部分;若給定小於該值,則要查找的關鍵字位於有序序列的前半部分。每次將有序序列的長度縮小一半之后,再從中間位置的記錄進行比較,依次反復進行。
查找過程如下:
1、查找初始化為low=1、high=length。其中low和high是兩個位置指示器,分別指向當前序列的第一個和最后一個值;
2、對當前有序序列做如下處理:
(1)求當前序列的中間位置:mid=(low+length)/2,mid為中間值的位置指示器;
(2)將要查找的查詢關鍵字與mid指示的值進行比較。若相等,查找結束,返回中間位置的值mid;若大於該值,則將查找范圍縮短為該序列的后半部分,此時改變low=mid+1,而high值不變;若小於該值,則將查找范圍縮短為該序列的前半部分,此時改變high=mid-1,而low值不變。
(3)重復執行過程(2)直至找到待查關鍵字,返回此值的位置mid,否則返回0。
#include<stdio.h> #include<stdlib.h> #define max_len 20 typedef struct { int key; char data; }Record; typedef struct { Record r[max_len+1]; int length; }seqTable; int BinarySearch(seqTable st,int k) { int low,high,mid; low=1; high=st.length; while(low<=high) { mid=(low+high)/2; if(st.r[mid].key<k) low=mid+1; else { if(st.r[mid].key>k) high=mid-1; else break; } } if(low>high) return 0; else return mid; } void main() { seqTable st; int i; int len; //定義變量為線性表的長度 int ch; //定義變量為線性表的輸入參數 int kk; //定義變量為查詢關鍵字 int res; //定義變量為查找函數返回值 printf("二分查找演示操作!\n"); printf("輸入線性表的長度:"); scanf("%d",&len); st.length=len; printf("輸入%d個記錄的關鍵字值(用空格隔開):\n",len); for(i=1;i<=len;i++) { scanf(" %d",&ch); st.r[i].key=ch; } printf("輸入查詢關鍵字:"); scanf("%d",&kk); res=BinarySearch(st,kk); if(res==0) printf("該查找表中不存在此記錄!\n"); else printf("該記錄位於該查找表中的第%d個!",res); printf("\n"); system("pause"); }
結果顯示: