鱼C论坛

 找回密码
 立即注册
查看: 2279|回复: 3

[已解决]二分法查找

[复制链接]
发表于 2022-11-9 15:56:51 | 显示全部楼层 |阅读模式

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

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

x
二分法查找,为什么没有运行出来
  1. #include<stdio.h>
  2. int search(int a[],int t,int n);
  3. int main()
  4. {
  5.     int a[5];
  6.         int i,j,t,find;
  7.         for(i=0;i<5;i++)
  8.                 scanf("%d",&a[i]);
  9.         printf("请输入一个新的整数:");
  10.         scanf("%d",&t);
  11.         find=search(a,t,5);
  12.         if(find==-1)
  13.                 printf("not found");
  14.         else
  15.                  printf("t的值是数中第%个:",find);
  16.         return 0;
  17. }
  18. int search(int a[],int t,int n)
  19. {
  20.         int left=0,right=4,mid;
  21.        
  22.     while(left <= right)
  23.     {
  24.                 mid=(left+right)/2;
  25.         if( t>a[mid])
  26.         {
  27.             left = mid + 1;
  28.         }
  29.         else if(t<a[mid])
  30.         {
  31.             right = mid - 1;
  32.         }
  33.         else
  34.         {
  35.            return mid;
  36.         }
  37.     }
  38.     return -1;
  39. }
复制代码
最佳答案
2022-11-9 16:08:18
本帖最后由 jackz007 于 2022-11-9 16:29 编辑
  1. #include<stdio.h>

  2. void sort(int a[] , int b[] , int n)
  3. {
  4.         int i , j , t                                    ;
  5.         for(i = 0 ; i < n ; i ++) b[i] = i               ;
  6.         for(i = 0 ; i < n - 1 ; i ++) {
  7.                 for(j = i + 1 ; j < n ; j ++) {
  8.                         if(a[b[i]] > a[b[j]]) {
  9.                                 t = b[i]                 ;
  10.                                 b[i] = b[j]              ;
  11.                                 b[j] = t                 ;
  12.                         }
  13.                 }
  14.         }
  15. }

  16. int search(int a[] , int t , int n)
  17. {
  18.         int b[n] , left = 0 , right = n , mid            ;
  19.         sort(a , b , n)                                  ;
  20.         while(left <= right)
  21.         {
  22.                 mid = (left + right) / 2                 ;
  23.                 if(a[b[mid]] == t) {
  24.                         return b[mid]                    ;
  25.                 } else {
  26.                         if(t > a[b[mid]]) left = mid + 1 ;
  27.                         else right = mid - 1             ;
  28.                 }
  29.         }
  30.         return -1                                        ;
  31. }

  32. int main(void)
  33. {
  34.         int a[5] , i , j , n , t , find                 ;
  35.         for(i=0 ; i < 5 ; i ++) scanf("%d" , & a[i])    ;
  36.         printf("请输入一个新的整数 : ")                 ;
  37.         scanf("%d" , & t)                               ;
  38.         find = search(a,t,5);
  39.         if(find == -1) printf("not found\n")            ;
  40.         else printf("t的值是数中第 %d个\n" , find + 1)  ;
  41.         return 0                                        ;
  42. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 3 5 2 8 1
  4. 请输入一个新的整数 : 5
  5. t的值是数中第 1个

  6. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  7. D:\[00.Exerciese.2022]\C>x
  8. 3 5 2 8 1
  9. 请输入一个新的整数 : 1
  10. t 的值是数中第 5个

  11. D:\[00.Exerciese.2022]\C>x
  12. 3 5 2 8 1
  13. 请输入一个新的整数 : 3
  14. t 的值是数中第 1个

  15. D:\[00.Exerciese.2022]\C>x
  16. 3 5 2 8 1
  17. 请输入一个新的整数 : 5
  18. t 的值是数中第 2个

  19. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-11-9 16:08:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-9 16:29 编辑
  1. #include<stdio.h>

  2. void sort(int a[] , int b[] , int n)
  3. {
  4.         int i , j , t                                    ;
  5.         for(i = 0 ; i < n ; i ++) b[i] = i               ;
  6.         for(i = 0 ; i < n - 1 ; i ++) {
  7.                 for(j = i + 1 ; j < n ; j ++) {
  8.                         if(a[b[i]] > a[b[j]]) {
  9.                                 t = b[i]                 ;
  10.                                 b[i] = b[j]              ;
  11.                                 b[j] = t                 ;
  12.                         }
  13.                 }
  14.         }
  15. }

  16. int search(int a[] , int t , int n)
  17. {
  18.         int b[n] , left = 0 , right = n , mid            ;
  19.         sort(a , b , n)                                  ;
  20.         while(left <= right)
  21.         {
  22.                 mid = (left + right) / 2                 ;
  23.                 if(a[b[mid]] == t) {
  24.                         return b[mid]                    ;
  25.                 } else {
  26.                         if(t > a[b[mid]]) left = mid + 1 ;
  27.                         else right = mid - 1             ;
  28.                 }
  29.         }
  30.         return -1                                        ;
  31. }

  32. int main(void)
  33. {
  34.         int a[5] , i , j , n , t , find                 ;
  35.         for(i=0 ; i < 5 ; i ++) scanf("%d" , & a[i])    ;
  36.         printf("请输入一个新的整数 : ")                 ;
  37.         scanf("%d" , & t)                               ;
  38.         find = search(a,t,5);
  39.         if(find == -1) printf("not found\n")            ;
  40.         else printf("t的值是数中第 %d个\n" , find + 1)  ;
  41.         return 0                                        ;
  42. }
复制代码

        编译运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 3 5 2 8 1
  4. 请输入一个新的整数 : 5
  5. t的值是数中第 1个

  6. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  7. D:\[00.Exerciese.2022]\C>x
  8. 3 5 2 8 1
  9. 请输入一个新的整数 : 1
  10. t 的值是数中第 5个

  11. D:\[00.Exerciese.2022]\C>x
  12. 3 5 2 8 1
  13. 请输入一个新的整数 : 3
  14. t 的值是数中第 1个

  15. D:\[00.Exerciese.2022]\C>x
  16. 3 5 2 8 1
  17. 请输入一个新的整数 : 5
  18. t 的值是数中第 2个

  19. D:\[00.Exerciese.2022]\C>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-9 16:29:36 | 显示全部楼层

请问我的是哪儿错了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-9 16:31:30 | 显示全部楼层
h-b-z-d-j-s-m 发表于 2022-11-9 16:29
请问我的是哪儿错了啊

       第 20 行 right = 4,应该是 right = n
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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