首页 > 代码库 > 折半查找(二分查找)
折半查找(二分查找)
折半查找:先确定待查找记录所在的范围(区间),然后逐步缩小范围知道找到或找不到该记录为止。
折半查找过程:以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等于给定值或查找区间的大小小于零时(表明查找不成功)为止。
关键字key与表中某一元素array[i]比较,有3中情况:
1. key == array[i], 查找成功
2.key > array[i], 待查找元素可能的范围是array[i]之前
3.key < array[i], 待查找元素可能的范围是array[i]之后
优点:
1、折半查找的效率比顺序查找要高。
2、折半查找的时间复杂度为log2(n)
3、折半查找的平均查找长度为log2(n+1) - 1
缺点:
1、折半查找只适用于有序表
2、折半查找限于顺序存储结构,对线性链表无法有效地进行折半查找
适用范围:对于规模较大的有序表查找,效率较高。适合很少改动但经常查找的表。
示例(binary.c):
#include <stdio.h> #include <stdlib.h> typedef int ElemType; #define EQ(a, b) ((a) == (b)) #define LT(a, b) ((a) < (b)) #define LQ(a, b) ((a) <= (b)) int Search_Bin(ElemType array[], int num, int length) { int index_low, index_mid, index_high; index_low = 1; index_high = length; while(index_low <= index_high){ index_mid = (index_low + index_high) / 2; if(EQ(num, array[index_mid])) return index_mid + 1; else if(LT(num , array[index_mid])) index_high = index_mid - 1; else index_low = index_mid + 1; } return -1; } int main(void) { ElemType array[] = {5, 13, 19, 21, 37, 56, 64, 75, 80, 88, 92}; int length = sizeof(array)/sizeof(ElemType); int index = Search_Bin(array, 19, length); if(index == -1){ printf("search failed.\n"); }else{ printf("the number 19‘s location is %d.\n", index); } return 0; }
编译:gcc binary.c
运行:./a.out
结果显示:the number 19‘s location is 3.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。