鱼C论坛

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

[已解决]二分法查找

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

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

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

x
二分法查找,为什么没有运行出来
#include<stdio.h>
int search(int a[],int t,int n);
int main()
{
    int a[5];
        int i,j,t,find;
        for(i=0;i<5;i++)
                scanf("%d",&a[i]);
        printf("请输入一个新的整数:");
        scanf("%d",&t);
        find=search(a,t,5);
        if(find==-1)
                printf("not found");
        else
                 printf("t的值是数中第%个:",find);
        return 0;
}
int search(int a[],int t,int n)
{
        int left=0,right=4,mid;
        
    while(left <= right)
    {
                mid=(left+right)/2;
        if( t>a[mid])
        {
            left = mid + 1;
        }
        else if(t<a[mid])
        {
            right = mid - 1;
        }
        else
        {
           return mid;
        }
    }
    return -1;
}
最佳答案
2022-11-9 16:08:18
本帖最后由 jackz007 于 2022-11-9 16:29 编辑
#include<stdio.h>

void sort(int a[] , int b[] , int n)
{
        int i , j , t                                    ;
        for(i = 0 ; i < n ; i ++) b[i] = i               ;
        for(i = 0 ; i < n - 1 ; i ++) {
                for(j = i + 1 ; j < n ; j ++) {
                        if(a[b[i]] > a[b[j]]) {
                                t = b[i]                 ;
                                b[i] = b[j]              ;
                                b[j] = t                 ;
                        }
                }
        }
}

int search(int a[] , int t , int n)
{
        int b[n] , left = 0 , right = n , mid            ;
        sort(a , b , n)                                  ;
        while(left <= right)
        {
                mid = (left + right) / 2                 ;
                if(a[b[mid]] == t) {
                        return b[mid]                    ;
                } else {
                        if(t > a[b[mid]]) left = mid + 1 ;
                        else right = mid - 1             ;
                }
        }
        return -1                                        ;
}

int main(void)
{
        int a[5] , i , j , n , t , find                 ;
        for(i=0 ; i < 5 ; i ++) scanf("%d" , & a[i])    ;
        printf("请输入一个新的整数 : ")                 ;
        scanf("%d" , & t)                               ;
        find = search(a,t,5);
        if(find == -1) printf("not found\n")            ;
        else printf("t的值是数中第 %d个\n" , find + 1)  ;
        return 0                                        ;
}
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

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

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

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

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

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

void sort(int a[] , int b[] , int n)
{
        int i , j , t                                    ;
        for(i = 0 ; i < n ; i ++) b[i] = i               ;
        for(i = 0 ; i < n - 1 ; i ++) {
                for(j = i + 1 ; j < n ; j ++) {
                        if(a[b[i]] > a[b[j]]) {
                                t = b[i]                 ;
                                b[i] = b[j]              ;
                                b[j] = t                 ;
                        }
                }
        }
}

int search(int a[] , int t , int n)
{
        int b[n] , left = 0 , right = n , mid            ;
        sort(a , b , n)                                  ;
        while(left <= right)
        {
                mid = (left + right) / 2                 ;
                if(a[b[mid]] == t) {
                        return b[mid]                    ;
                } else {
                        if(t > a[b[mid]]) left = mid + 1 ;
                        else right = mid - 1             ;
                }
        }
        return -1                                        ;
}

int main(void)
{
        int a[5] , i , j , n , t , find                 ;
        for(i=0 ; i < 5 ; i ++) scanf("%d" , & a[i])    ;
        printf("请输入一个新的整数 : ")                 ;
        scanf("%d" , & t)                               ;
        find = search(a,t,5);
        if(find == -1) printf("not found\n")            ;
        else printf("t的值是数中第 %d个\n" , find + 1)  ;
        return 0                                        ;
}
        编译运行实况:
D:\[00.Exerciese.2022]\C>g++ -o x x.c

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

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

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

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

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

D:\[00.Exerciese.2022]\C>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

请问我的是哪儿错了啊
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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