資料結構 順序表查詢(折半查詢 差值查詢)

2022-09-04 12:27:14 字數 2099 閱讀 5275

#include #include 

#include

#define maxsize 10

首先構造乙個陣列, 由隨機數生成, 同時確保沒有重複元素。(為了排序之後查詢時候方便)

為了確保沒有重複的元素使用了乙個簡單的查詢函式:

用陣列的0號元素來作為哨兵

化簡了操作:

int search0(int *a,int length,int

key)

return

i; //這樣如果沒有查詢到元素,就會return 0;

}

int a[maxsize] = ;

inti;

intfind;

intrec;

srand((unsigned)time(null));

for(i=1;i1;i++)

還需要乙個函式 顯示陣列裡所有元素:

void print_list(int *a,int

length)

printf("\n

");}

使用冒泡法進行排序:

void sort(int *a,int

length)}}

}

之後是折半查詢的函式:

int search_half(int *a,int length,int

key)

return0;

}

首先需要確保是乙個有序的表,這樣通過比較key 和 mid的大小

如果key小於mid則說明key可能在小於mid的區域 high 調整

如果key大於mid則說明key可能在大於mid的區域 low 調整

相等就找到了

效果如圖:

那麼另乙個問題出現了:為什麼一定要折半呢?

比如說在0~1000內查詢5 折半就很不明智了吧。

最初的公式可以理解為:

mid = (low+high)/2 = low+1/2*(high - low)

mid = low+(key-a[low])/(a[high]-a[low])*(highj - low)

比如說還是在 0~1000個內尋找5

第一次的mid 修改為 mid = 0+(5-0)/(1000-0)*1000 = 5   顯然能看出 當插值明顯很小(或者很大) mid 的取值取決於key在整體的大小趨勢, 這樣mid也會明顯變小(或者很大)

測試, 將maxsize 增大為20

比常規的折半相比, 速度更快了。

完整程式:

#include #include 

#include

#define maxsize 20

void print_list(int *a,int

length)

printf("\n

");}void sort(int *a,int

length)}}

}int search0(int *a,int length,int

key)

returni;}

int search_half(int *a,int length,int

key)

return0;

}int

main()

;

inti;

intfind;

intrec;

srand((unsigned)time(null));

for(i=1;i1;i++)

print_list(a,maxsize);

sort(a,maxsize);

print_list(a,maxsize);

while(1

)

return0;

}

資料結構筆記(查詢 順序查詢 折半查詢)

1 列表 由同一型別的資料元素組成的集合。2 關鍵碼 資料元素中的某個資料項,可以標識列表中的乙個或一組資料元素。3 鍵值 關鍵碼的值。4 主關鍵碼 可以唯一地標識乙個記錄的關鍵碼。5 次關鍵碼 不能唯一地標識乙個記錄的關鍵碼。6 查詢 在具有相同型別的記錄構成的集合中找出滿足給定條件的記錄。7 查...

資料結構4 順序查詢與折半查詢

順序查詢 針對無序的資料,有序的資料可以用更高效的資料查詢方式 在無序的資料查詢中,順序查詢是最入門 最簡單的演算法,該演算法雖然簡單,但是當資料量增多時,查詢效率較低。比如在100萬資料中,平均需要查詢大約50萬次,從演算法角度來說,是很難接受的。從演算法角度來說,很自然要考慮到演算法的優化。經過...

C語言資料結構順序表的順序查詢和折半查詢的功能

順序查詢演算法 又稱為線性查詢,主要用在 線性表 中進行查詢 通常分為 1 無序線性表的一般查詢 2 對關鍵字有序的順序表查詢 優缺點分析 缺點 當線性表的表長過於長時,平均查詢長度較大,效率低。優點 對順序表中資料元素的儲存沒有要求,順序儲存鏈式儲存均可。需注意 對於線性表的鏈式儲存只能使用順序查...