相關知識
折半查詢通常是針對順序儲存的線性表,線性表的結點按關鍵碼從小到大排序,後面稱之為折半查詢的順序表。為了簡化討論,假設折半查詢的順序表中每個結點只含乙個關鍵碼,關鍵碼為整數。圖 1 給出了乙個儲存了 4 個關鍵碼的折半查詢的順序表的儲存結構圖。
下面描述了線性表順序儲存的一種實現方案。該實現方案的示意圖為:
指標pkey是儲存關鍵碼的連續空間的起始位址,順序表中當前的關鍵碼的個數由len給出,該順序表中最多可儲存max個關鍵碼。
將pkey、len、max組織成乙個結構,該結構定義為:
struct bseqlist
;
只要給定指向該結構的一指標blist,就可對線性表進行操作。
對折半查詢的順序表定義如下操作,各個操作函式的功能詳見下面給出的**檔案 bslist.cpp 的**框架:
bseqlist*
bsl_create
(int size)
;void
bsl_free
(bseqlist* blist)
;int
bsl_inskey
(bseqlist* blist,
int key)
;int
bsl_findkey
(bseqlist* blist,
int key)
;int
bsl_delkey
(bseqlist* blist,
int key)
;void
bsl_print
(bseqlist* blist)
;
輸入輸出格式說明
輸入格式:
首先輸入乙個正整數max,建立乙個最多可儲存max個元素的表。
然後輸入多個操作:如果輸入 「insert」 ,則後面跟乙個數x,表示將x插入;如果輸入 「delete」 ,則後面跟乙個數x,表示將x刪除;如果輸入 「end」 ,表示輸入結束。
輸出格式:
輸出表的長度,然後從表頭到表尾依次輸出各元素。
以下是平台對 step1/main.cpp 的樣例測試集:
樣例輸入:
9
insert 9
insert 8
insert 89
insert 11
insert 22
insert 13
delete
11delete
5end
樣例輸出:
list length:
5the list contains:89
1322
89
//折半查詢的順序表 實現檔案
//每個結點的資料是關鍵碼
//#include
#include
#include
"bslist.h"
bseqlist*
bsl_create
(int size)
//建立乙個順序表
//與bsl_free()配對
void
bsl_free
(bseqlist* blist)
//釋放/刪除順序表
//與bsl_create()配對
intbsl_findkey
(bseqlist* blist,
int key)
//在排序的順序表中查詢關鍵碼值為key的結點,返回結點的編號
//返回值大於等於0時表示找到值為key的結點的編號,-1表示沒有找到
else
else}}
return-1
;}intbsl_inskey
(bseqlist* blist,
int key)
//在排序的順序表中插入乙個值為key的結點
//返回值大於等於0時表示插入的位置, -1表示表滿(無法插入)
int k, r, m;
k=0; r=blist-
>len-1;
//尋找插入位置
while
(k<=r)
if(key
>pkey[m]
)else
}//插入位置為k, 騰出k號位置
for(r=blist-
>len; r>k; r--
)//key放入k號位置
blist-
>pkey[k]
=key;
blist-
>len++
;return k;
}int
bsl_delkey
(bseqlist* blist,
int key)
//在排序的順序表中刪除值為key的結點,
//存在值為x的結點則返回結點編號, 未找到返回-1
int i=k;
while
(i < blist-
>len-1)
blist-
>len --
;return k;
}void
bsl_print
(bseqlist* blist)
//列印整個順序表
printf
("the list contains: ");
for(
int i=
0; i
>len; i++
)printf
("\n");
}
資料結構 查詢演算法(折半查詢)
當乙個順序表的元素是有序排列的,這時我們才可以使用折半查詢。我們查詢的過程是找到中間位置判斷這個位置上的值是不是目標值,若是則直接找到,若不是,判斷中間位置上的值與目標值的大小關係,若是大於目標值說明我們要查詢的目標值在前半部分,小於則說明是在後半部分,然後我們在要找的部分裡面用上面同樣的方式查詢,...
資料結構 查詢 折半查詢
簡單介紹下折半查詢,折半查詢僅適用於有序的順序表。查詢成功的平均查詢長度為log2 n 1 1 折半查詢判定樹的樹高為log2 n 1 向上取整 下面投放折半查詢 include include define maxsize 50 define keytype int 順序表結構體 typedef ...
資料結構與演算法(C ) 順序查詢與折半查詢
順序查詢 速度慢 例如 100萬個資料,平均要找50萬次 沒有排序的資料 只能順序查詢 include using namespace std int sequesearch int a,const int n,const int x int main int result int num 7 re...