實現折半查詢 資料結構與演算法 查詢

2021-10-05 10:39:22 字數 2861 閱讀 5996

相關知識

折半查詢通常是針對順序儲存的線性表,線性表的結點按關鍵碼從小到大排序,後面稱之為折半查詢的順序表。為了簡化討論,假設折半查詢的順序表中每個結點只含乙個關鍵碼,關鍵碼為整數。圖 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...