折半查找法的两种实现

折半查找法:

在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:

1)     待查找数据值与中间元素值正好相等,则放回中间元素值的索引。

2)     待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3)     待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4)     如果最后找不到相等的值,则返回错误提示信息。

按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为

log2(n+1)-1

[cpp] view plaincopy

  1. //Data为要查找的数组,x为待查找数据值,beg为查找范围起始,last为查找范围终止
  2. //非递归法
  3. int BiSearch(int data[], const int x, int beg, int last)
  4. {
  5. int mid;//中间位置
  6. if (beg > last)
  7. {
  8. return -1;
  9. }
  10. while(beg <= last)
  11. {
  12. mid = (beg + last) / 2;
  13. if (x == data[mid] )
  14. {
  15. return mid;
  16. }
  17. else if (data[mid] < x)
  18. {
  19. beg = mid + 1;
  20. }
  21. else if (data[mid] > x)
  22. {
  23. last = mid - 1;
  24. }
  25. }
  26. return -1;
  27. }
  28. //递归法
  29. int IterBiSearch(int data[], const int x, int beg, int last)
  30. {
  31. int mid = -1;
  32. mid = (beg + last) / 2;
  33. if (x == data[mid])
  34. {
  35. return mid;
  36. }
  37. else if (x < data[mid])
  38. {
  39. return IterBiSearch(data, x, beg, mid - 1);
  40. }
  41. else if (x > data[mid])
  42. {
  43. return IterBiSearch(data, x, mid + 1, last);
  44. }
  45. return -1;
  46. }
  47. //主函数
  48. int _tmain(int argc, _TCHAR* argv[])
  49. {
  50. int data1[60] = {0};
  51. int no2search = 45;
  52. cout << "The array is : " << endl;
  53. int siz = sizeof(data1)/sizeof(int);
  54. for (int i = 0; i < siz; i++)
  55. {
  56. data1[i] = i;
  57. cout << data1[i] << " ";
  58. }
  59. cout << endl;
  60. int index = -1;
  61. //index = BiSearch(data1, no2search, 0, siz);
  62. index = IterBiSearch(data1, no2search, 0, siz);
  63. cout << "Index of " << no2search << " is " << index << endl;
  64. getchar();
  65. return 0;
  66. }
时间: 2024-10-17 13:16:47

折半查找法的两种实现的相关文章

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

小朋友学数据结构(6):折半查找法 折半查找法又称为二分查找法. (一)基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表. 重复以上过程,直到找到满足条件的记录,此时查找成功:或直到子表不存在为止,此时查找不成功. 2.png (二)时间复杂度 二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x

【分治】折半查找法

问题 K: [分治]折半查找法 时间限制: 1 Sec  内存限制: 128 MB提交: 17  解决: 9[提交][状态][讨论版] 题目描述 大魔导师培根曾经说过:“读书使人明智,读诗使人聪慧,演算使人精密,哲理使人深刻,伦理学使人有修养,逻辑修辞使人善辩.”由此可见书籍的重要性是不言而喻的.而与书籍天天打交道的图书管理员,更是夺天地之造化,吸日月之精华的“神之职业”.据史料记载,魔法世界从古至今诞生的众多不平凡的人物中,有不少人都曾经做过“图书管理员”,如道家学派创始人老子,威软公司创始人

对分查找法(二分查找法,折半查找法)

二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int binarysearch(const int array[], int x, int N) { int low, mid, high; low = 0, high = N - 1; while (low <= high) { mid = (low + high) / 2; if(array[mid] <

折半查找法的温习

折半查找法适合于1采用顺序存储结构的2必须按照关键字大小排序的序列查找 如代码所示: 1 #include <stdio.h> 2 3 int BinSearch(int a[], int length, int k) 4 { 5 int low = 0, high = length - 1; 6 int mid; 7 while(low <= high) 8 { 9 mid = (low + high) / 2; 10 if(a[mid] == k) 11 return mid; 12

数据结构50:二分查找法(折半查找法)

折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 例如,在{5,21,13,19,37,75,56,64,88 ,80,92}这个查找表使用折半查找算法查找数据之前,需要首先对该表中的数据按照所查的关键字进行排序:{5,13,19,21,37,56,64,75,80,88,92}. 在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需

C语言数组之冒泡排序+折半查找法(二分查找)

冒泡排序算法 1 int num[5]; 2 int i; 3 //循环接收用户输入的元素 4 for(i=0;i<5;i++){ 5 printf("请输入第%d个元素\n",i+1); 6 scanf("%d",&num[i]); 7 } 8 for(i=0;i<4;i++){ //外层循环,控制排序的轮数 9 int j; 10 for(j=0;j<4-i;j++){ //内层循环,控制冒牌排序每轮的次数 11 if(num[j]&g

输入一组有序数据,使用折半查找法查找一个数据,并输出位置

#include <stdio.h> /** * 使用折半查找,来查找一个数 * * @param arr 数组 * @param len 数组的长度 * @param key 要查找的数 * * @return 要查找的数的位置,如果查找不到返回 -1 */ int searchItem(int arr[], int len, int key) { // 定义变量 int low = 0, high = len - 1, mid; // 循环 while (low <= high) {

算法:折半查找法

输入代码: /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:sum123.cpp * 作 者:林海云 * 完成日期:2015年1月12日 * 版 本 号:v2.0 * * 问题描述:给定一个排序好的数组,使他可以具备查找功能 * 输入描述:要查找的数 * 程序输出:查找数的位置 */ #include<iostream> using namespace std; const int n=10; int main(

有15个数按从大到小的顺序存放在一个数组中, 用折半查找法找出该数是数组的第几个元素的值, 如果该数不在数组中,则输出“无此数”

//2017年7月22日 #include <stdio.h> #define LEN 15 int main(){ int n; void binSearch(int * p,int n); int arr[LEN]={98,97,88,87,76,70,65,54,43,42,39,36,35,31,29}; printf("请输入要查找的数:\n"); scanf("%d",&n); binSearch(arr,n); return 0;