鱼C论坛

 找回密码
 立即注册
查看: 14786|回复: 24

[技术交流] 折半查找法(递归实现)

[复制链接]
发表于 2013-2-26 22:59:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:假设有数组 int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};

要求:用递归的方法实现折半查找法。

提示:折半查找法文字速成教程(http://bbs.fishc.com/thread-27964-1-1.html


视频讲解:http://blog.fishc.com/2214.html

源代码参考:http://bbs.fishc.com/thread-28077-1-1.html

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-2-26 23:00:53 | 显示全部楼层
循环的问题全部可以转换为递归问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2013-2-26 23:01:25 | 显示全部楼层
小甲鱼,very good 加油:victory:
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-24 11:29:46 | 显示全部楼层
  1. #include <stdio.h>

  2. int bin_search(int *str, int n, int key)
  3. {
  4.     int m, low = 0, high = n-1;
  5.     int mid = (low+high)/2;

  6.      if ( str [mid] == key)
  7.         return mid;
  8.     if ( str[low] >= str[high])
  9.         return -1;
  10.     if ( str[mid] < key )
  11.     {
  12.         low = mid + 1;
  13.         m = bin_search(&str[low], high-low+1, key);
  14.     }
  15.     if ( str[mid] > key )
  16.     {
  17.         high = mid - 1;
  18.         m = bin_search(&str[low], high-low+1, key);
  19.     }
  20.     if ( -1 != m )
  21.         m += low;

  22.     return m;
  23. }

  24. int main(void)
  25. {
  26.     int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
  27.     int m,addr;

  28.     printf("请输入待查找的关键字: ");
  29.     scanf("%d", &m);

  30.     addr = bin_search(str, 11, m);
  31.     if ( -1 != addr )
  32.     {
  33.         printf("查找成功,可喜可贺,可口可乐! 关键字 %d 所在的位置是: %d\n", m, addr);
  34.     }
  35.     else
  36.     {
  37.             printf("查找失败!\n");
  38.     }

  39.     return 0;
  40. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2013-8-24 23:13:59 | 显示全部楼层
我只是路过打酱油的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-10-6 15:52:42 | 显示全部楼层
穷死了没钱啊 代码又下载不了了 伤心
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-12-24 23:17:38 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. void BinSearch(int a[], int n, int search_val){
  4.     int *low, *mid, *high;
  5.     low = a;
  6.     high = low + n;
  7.     mid = low + (high - low)/2;

  8.     if((*mid) > search_val)
  9.         BinSearch(low, mid-low, search_val);
  10.     if((*mid) < search_val)
  11.         BinSearch(mid, high-mid, search_val);

  12.     if((*mid) == search_val)
  13.         printf("找到%d\n", search_val);
  14.     if(mid == low)
  15.         printf("找不到!");
  16. }


  17. int main()
  18. {
  19.     int a[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
  20.     BinSearch(a, 10, 55);
  21.     return 0;
  22. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-1-24 16:39:51 | 显示全部楼层
  1. #include<stdio.h>
  2. int find(int a[11],int low,int high,int number)
  3. {
  4. int mid =(low+high)/2;
  5. if (low>high)
  6. {
  7.         mid=-1;
  8.         return mid;
  9. }
  10. if(a[mid]==number)
  11. return mid+1;
  12. else
  13. {if(number<a[mid])
  14. high =mid-1;
  15. else
  16. low  =mid+1;
  17. find(a,low,high,number);
  18. }
  19. }
  20. int main()
  21. {
  22.         int find(int a[11],int low,int high,int number);
  23.         int number,low=0,high=10,findnumber;
  24.         int a[11]={1,1,2,3,5,8,13,21,34,55,89};
  25.         printf("please input a number:");
  26.         scanf("%d",&number);
  27.         if(number<a[0] || number > a[10])
  28.         printf ("no find\n");
  29.     else
  30.         {
  31.         findnumber=find(a,low,high,number);
  32.         if(findnumber==-1)
  33.     printf("no find\n");
  34.         else
  35.         printf("The number is %d\n",findnumber);
  36.         }
  37. }
复制代码
我自己写的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-8 21:57:07 | 显示全部楼层
  1. #include <iostream>

  2. int find(int arr[], int low, int high, int n) //使用折半查找法的函数要求被查找数组已被排序
  3. {
  4.     int mid = (high + low) / 2; // 找出数组中间元素的下标
  5.     if (arr[mid] == n) // 如果找到数据,返回数据在数组中的位置,结束递归调用
  6.         return mid;
  7.     else if (mid == high || mid == low) // 如果数组中不存在该数据,返回-1
  8.         return -1;
  9.     else if (arr[mid] < n) // 如果中间元素小于被查找元素,则到数组后半段进行查找
  10.         return find(arr, mid + 1, high, n);
  11.     else // 如果中间元素大于被查找元素,则到数组前半段进行查找
  12.         return find(arr, low, mid, n);
  13. } // find函数也可以使用迭代实现

  14. int main()
  15. {
  16.     int arr[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
  17.     int pos = find(arr, 0, 10, 55);
  18.     std::cout << "55 = arr[" << pos << "]\n";
  19.     pos = find(arr, 0, 10, 1);
  20.     std::cout << "1 = arr[" << pos << "]\n"; //这里的pos = 1,说明如果数组中有重复元素折半查找法将查找下标值较大的元素
  21.     return 0;
  22. }
复制代码
这是我的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-8 22:02:51 | 显示全部楼层

你这段代码有错
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-17 22:05:29 | 显示全部楼层
真是难得给力的帖子啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-29 15:48:30 | 显示全部楼层
qiang li hzi chi lou zhu
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-25 20:38:13 | 显示全部楼层
# include <stdio.h>

void search(int *, int, int, int);

int main(void)
{
        int a[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
        search(a, 13, 0, 10);

        return 0;
}

void search(int * a, int val, int low, int hig)
{
        int mid = (low + hig) / 2;

        if ( low > hig ) {
                printf("search false!\n");
                return;
        }

        if ( a[mid] == val )
                printf("%d\n", mid + 1);
        else if ( a[mid] > val )
                search(a, val, low, mid-1);
        else
                search(a, val, mid + 1, hig);
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-9-12 16:32:41 | 显示全部楼层
#include <stdio.h>


int bin_search(int str[], int key, int low, int high)
{
        int mid = (low + high) / 2;

        if (low > high)
                return -1;
        if (str[mid] == key)
                return mid;
        if (str[mid] < key)
                low = mid + 1;
        if (str[mid] > key)
                high = mid - 1;
        bin_search(str, key, low, high);
}


int main()
{
        int str[11] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89};
        int key, addr;

        printf("请输入待查找关键字:");
        scanf("%d", &key);

        addr = bin_search(str, key, 0, 10);

        if (-1 != addr)
        {
                printf("查找成功!关键字%d所在位置是:%d\n", key, addr + 1);
        }
        else
        {
                printf("查找失败!\n");
        }
        return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-9-20 04:35:46 | 显示全部楼层
求解答:那句if ( -1 != m )
                    m += low;
是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-27 16:02:16 | 显示全部楼层
:sad好哈呀。。以后常来学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-16 21:52:26 | 显示全部楼层
强烈支持楼主ing……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-29 21:09:41 | 显示全部楼层
zhuiyilx 发表于 2014-9-20 04:35
求解答:那句if ( -1 != m )
                    m += low;
是什么意思?

如果 m 不等 -1, m 等于 m 加 low;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-11-29 21:10:15 | 显示全部楼层
  1. /****************************************************************/
  2. /************    查找元素是否在待查数据中      ****************/
  3. /******************   利用折半查找法实现   ********************/
  4. /***************** By Hellogz 2014.11.29 ***********************/
  5. /***************************************************************/
  6. #include <stdio.h>
  7. #include <stdlib.h>

  8. #define NUM     12      //数组的大小

  9. //函数功能:查找某个元素是否在数组中
  10. //参数 low:最低位下标
  11. //参数 high:最高位下标
  12. //参数 key:待查找的元素
  13. //参数 str[]:被查找的数组
  14. int found(int low, int high, int key, int str[])
  15. {
  16.     int mid;

  17.     if (low > high)
  18.     {
  19.         return -1;
  20.     }
  21.     else
  22.     {
  23.         mid = (low + high) / 2;

  24.         if (key == str[mid])
  25.             return mid;
  26.         if (key > str[mid])
  27.             return found(mid + 1, high, key, str);
  28.         if (key < str[mid])
  29.             return found(low, mid - 1, key, str);
  30.     }
  31. }

  32. int main()
  33. {
  34.     int str[NUM] = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144};
  35.     int n, addr;

  36.     printf("请输入待查找的关键字:");
  37.     scanf("%d", &n);

  38.     addr = found(0, NUM -1, n, str);
  39.     if (-1 != addr)
  40.     {
  41.         printf("\n查找成功,关键字 %d 所在的位置是:%d\n", n, addr);
  42.     }
  43.     else
  44.     {
  45.         printf("\n关键字 %d 不在列表中!\n", n);
  46.     }

  47.     system("pause");

  48.     return 0;
  49. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-18 21:55:43 | 显示全部楼层
很好
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 10:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表