#include #include首先構造乙個陣列, 由隨機數生成, 同時確保沒有重複元素。(為了排序之後查詢時候方便)#include
#define maxsize 10
為了確保沒有重複的元素使用了乙個簡單的查詢函式:
用陣列的0號元素來作為哨兵
化簡了操作:
int search0(int *a,int length,intkey)
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 和 mid的大小key)
return0;
}
如果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 對關鍵字有序的順序表查詢 優缺點分析 缺點 當線性表的表長過於長時,平均查詢長度較大,效率低。優點 對順序表中資料元素的儲存沒有要求,順序儲存鏈式儲存均可。需注意 對於線性表的鏈式儲存只能使用順序查...