#查詢演算法#【1】簡單查詢:順序、折半查詢

範長法@三月軟體發表於2014-07-22
•順序查詢

  從線性表的一端開始,依次將每個記錄的關鍵字與給定值進行比較,若某個記錄的關鍵字等於給定值,表示查詢成功,返回記錄序號;若將線性表中所有記錄都比較完,仍未找到關鍵字與給定值相等的記錄,則表示查詢失敗,返回一個失敗值。

•折半查詢

  又稱為二分查詢。這種查詢方法要求查詢表的資料是線性結構儲存,並且還要求查詢表中的資料是按關鍵字由小到大有序排列。

 

順序查詢比較簡單,依次用陣列中的每個元素和要查詢的元素進行對比即可。不再貼程式碼說明

折半查詢是一種遞迴過程,每折半一次,可使查詢範圍縮小一半,當查詢範圍縮小到只剩一個元素,而該元素還不是要找的元素,則查詢失敗。

折半查詢說明如下圖:

  

 

折半查詢程式碼如下:

 1 #include <stdio.h>
 2 #define LENGTH 10
 3 int source[LENGTH] = {10,12,28,37,54,65,69,86,90,98};
 4 
 5 //二分查詢,查詢key在原始資料a中的位置
 6 int BinarySearch(int a[],int n,int key){
 7     int low,high,mid;
 8 
 9     low = 0;
10     high = n-1;
11 
12     while(low<=high){
13         mid = (low + high)/2;    //每次讓中間數取最小和最大的中間
14         if(a[mid] == key)    //查詢的元素正好等於中間值
15             return mid;
16         else if(key < a[mid])    //查詢的元素小於中間值,在最小值和上次中間值範圍內查詢
17             high = mid - 1;
18         else
19             low = mid + 1;    //查詢的元素大於中間值,在中間值和最大值範圍查詢
20     }
21 
22     return -1;
23 }
24 
25 int main(){
26     int i,key,pos;
27     printf("原始資料:\n");
28     
29     for(i = 0 ; i < LENGTH ; i++)
30         printf("%d ",source[i]);
31 
32     printf("\n請輸入要查詢的資料:");
33     scanf("%d",&key);
34 
35     pos = BinarySearch(source,LENGTH,key);
36     
37     if(pos > -1)
38         printf("\n查詢成功,查詢元素位於第 %d 個",pos);
39     else
40         printf("\n查詢失敗");
41 
42 }

 

 

  

相關文章