算法思想
折半查找又称为二分查找, 仅适用于有序的顺序表
算法实现(C语言)
#define ElemType int
typedef struct {
ElemType *elem;
int tableLen;
}SSTable;
int binarySearch(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 if(L.elem[mid] < key)
low = mid + 1; // 从后半部分继续查找
}
return -1; // 查找失败, 返回-1
}
查找效率分析
-
查找成功的情况
ASL(Average Search Length)成功=(1 * 1 + 2 * 2 + 3 * 4 + 4 * 4) / 11 = 3;
-
查找失败的情况
ASL(Average Search Length)失败=(3 * 4 + 4 * 8) / 12 = 11/3;
折半查找判定树的构造
右子树一定比左子树多一个元素 或者 右子树和左子树元素个数相等 (mid是取的向下取整)
折半查找效率
虽然折半查找的时间复杂度比顺序查找的时间复杂度要小, 但是折半查找不是一定比顺序查找优秀. 只是大部分情况折半查找比顺序查找要优秀.