小朋友学数据结构(6):折半查找法

您所在的位置:网站首页 1向下取整为什么还是1 小朋友学数据结构(6):折半查找法

小朋友学数据结构(6):折半查找法

2024-07-13 05:16| 来源: 网络整理| 查看: 265

折半查找法又称为二分查找法。 #一、基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 重复以上过程,直到找到满足条件的记录,此时查找成功;或直到子表不存在为止,此时查找不成功。

2.png

#二、时间复杂度 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果xa[n/2],则只要在数组a的右半部搜索x。 时间复杂度就是求while循环的次数。 假设总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k,其中k就是循环的次数。 由于n/2^k取整后>=1,令n/2^k=1, 可得k=log2(n),(以2为底n的对数)。 所以时间复杂度可以表示为O(h)=O(log2(n))

#三、优缺点 优点是比较次数少,查找速度快,平均性能好; 缺点是要求待查表为有序表,且插入删除困难。 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

#四、C++实现

#include using namespace std; // 递归实现 int recur_bin_search(int a[], int low, int high, int key) { if(low > high) { return -1; } int mid = (low + high) / 2; if(key == a[mid]) { return mid; } else if(key < a[mid]) { return recur_bin_search(a, low, mid - 1, key); } else { return recur_bin_search(a, mid + 1, high, key); } } // 非递归实现 int bin_search(int a[], int n, int key) { int low ,high, mid; low = 0; high = n - 1; while(low > 1); //向下取整 if (a[mid] < key) { low = mid + 1; } else { high = mid; } } if (a[high] == key) { return high; } return -1; } // 非递归实现,向上取整 int bin_search_2(int a[], int n, int key) { int mid, low = 0, high = n - 1;//闭区间[0, n - 1] while (low < high) { mid = low + ((high + 1 - low) >> 1);//加1是向上取整 if (a[mid]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3