折半查找
- 算法思想
- 算法實現
- 查找判定樹
- 折半查找效率
折半查找的算法思想
折半查找,又稱“二分查找”,僅適用於有序的順序表
33>mid,往右查
右指針到一個位置就-1,左指針到一個位置就+1
low>high,查找失敗
折半查找的實現
typedef struct{
ElemType *elem;
int TableLen;
}SSTable;
//折半查找(升序)
int Binary_Search(SSTable L,ElemType key){
int low = 0,high = L.TableLen-1,mid;
while(low<=high){
mid = (low+high)/2; //取中間位置
if(L.elem[mid] == key)
return mid; //查找成功則返回所在位置
else if(L.elem(mid)>key)
high = mid -1; //從前半部分繼續查找
else
low = mid +1; //從后半部分繼續查找
}
return -1; //查找失敗,返回-1
}
順序表擁有隨機訪問的特性,鏈表沒有
查找效率復分析
查找判定樹的構造
如果當前low和high之間有奇數個元素,則mid分隔后,左右兩個部分元素個數相等
如果當前low和high之間有偶數個元素,則mid分隔后,左半部分比右半部分少一個元素
折半查找的判定樹中,若 mid=向下取整(low+high)/2,對於任何一個結點,必有:右子樹結點-左子樹結點=0或1
自己過一遍順序,1個元素,2個元素,。。。
折半查找的判定樹一定是平衡二叉樹
因此,元素個數為n時
\[樹高h=\lceil log_2(n+1) \rceil \]
計算完全二叉樹也相同
滿足二叉排序樹的定義
失敗節點:n+1個,等於成功結點的空鏈域數量
知識回顧
大部分情況下折半查找速度都比順序查找快。但是不一定哦
從上去整,不一樣哦,左邊的比較多