查找 - 折半查找

457 阅读1分钟

算法思想

折半查找又称为二分查找, 仅适用于有序的顺序表

image.png

算法实现(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
}

查找效率分析

  • 查找成功的情况 image.png ASL(Average Search Length)成功=(1 * 1 + 2 * 2 + 3 * 4 + 4 * 4) / 11 = 3;

  • 查找失败的情况

image.png ASL(Average Search Length)失败=(3 * 4 + 4 * 8) / 12 = 11/3;

折半查找判定树的构造

image.png

右子树一定比左子树多一个元素 或者 右子树和左子树元素个数相等 (mid是取的向下取整)

image.png

折半查找效率

image.png

虽然折半查找的时间复杂度比顺序查找的时间复杂度要小, 但是折半查找不是一定比顺序查找优秀. 只是大部分情况折半查找比顺序查找要优秀.