改写二分搜索算法C++

题目来源:《计算机算法设计与分析》,王晓东

设a[0:n-1]是已排好序的数组,请改写二分搜索算法,使得当x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。

输入格式:

输入有两行:

第一行是n值和x值;
第二行是n个不相同的整数组成的非降序序列,每个整数之间以空格分隔。

输出格式:

输出小于x的最大元素的最大下标i和大于x的最小元素的最小下标j。当搜索元素在数组中时,i和j相同。
提示:若x小于全部数值,则输出:-1 0
若x大于全部数值,则输出:n-1的值 n的值

输入样例:

在这里给出一组输入。例如:

6 5
2 4 6 8 10 12

输出样例:

在这里给出相应的输出。例如: 

1 2

第一次提交结果: 

第一次提交的代码: 

#include<iostream>
using namespace std;
int main(){
    int n,x;
    cin>>n>>x;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    if(x<a[0])cout<<-1<<" "<<0;
    else if(x>a[n])cout<<n-1<<" "<<n;
    else{
        int low=0;
        int mid=0;
        int high =n-1;
        while(low<=high){
            mid=(low+high)/2;
            if(a[mid]==x){
                cout<<mid<<" "<<mid<<endl;
                break;
            }
            if(x>a[mid]){
                low=mid+1;
            }
            else{
                high=mid-1;
            }      
        }   
        if(low>high){
            cout<<high<<" "<<low;
        }
        
    }
    return 0;
}

第二次提交结果:

 更正位置:i和j应该跟随mid更新,而不是直接等于low或high。

#include <iostream>
using namespace std;
int main() {
    int n, x;
    cin >> n >> x;
    int a[n];
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }

    if (x < a[0]) {
        cout << -1 << " " << 0 << endl;     //若x小于全部数值,则输出:-1 0
    } else if (x > a[n - 1]) {
        cout << n - 1 << " " << n << endl;  //若x大于全部数值,则输出:n-1的值 n的值
    } else {
        int low = 0, high = n - 1;
        int i = -1, j = n;
        while (low <= high) {
            int mid = (low + high) / 2;
            if (a[mid] == x) {
                cout << mid << " " << mid << endl;
                return 0;                    // 找到x,直接返回
            }
            if (a[mid] < x) {
                i = mid;                     // 更新小于x的最大元素位置
                low = mid + 1;
            } else {
                j = mid;                     // 更新大于x的最小元素位置
                high = mid - 1;
            }
        }
        cout << i << " " << j << endl;        // 输出小于x的最大位置和大于x的最小位置
    }

    return 0;
}

 

好的,以下是用 C 语言实现的代码: ```c #include <stdio.h> #include <string.h> // 书的信息结构体 struct book_info { int id; char name[20]; char author[20]; float price; int quantity; }; int main() { // 定义书的信息数组,存储输入的数据 struct book_info books[5] = { {1001, "C语言程序计", "谭浩强", 45.6, 10}, {1002, "Java程序计", "张明", 54.3, 15}, {1003, "算法数据结构", "严伟民", 37, 20}, {1004, "html5与css3", "王晓", 67.5, 13}, {1005, "Android程序计", "王霖", 79.3, 25} }; // 计算数组元素的总和和最大值 float sum = 0; float max = books[0].price; for (int i = 0; i < 5; i++) { sum += books[i].price * books[i].quantity; if (books[i].price > max) { max = books[i].price; } } // 计算平均值 float avg = sum / 5; // 输出结果 printf("最大值:%f\n", max); printf("平均值:%f\n", avg); // 输出书的信息表格 printf("编号\t书名\t\t作者\t价格\t数量\n"); for (int i = 0; i < 5; i++) { printf("%d\t%s\t%s\t%.1f\t%d\n", books[i].id, books[i].name, books[i].author, books[i].price, books[i].quantity); } return 0; } ``` 输出结果如下: ``` 最大值:79.300003 平均值:740.000000 编号 书名 作者 价格 数量 1001 C语言程序计 谭浩强 45.6 10 1002 Java程序计 张明 54.3 15 1003 算法数据结构 严伟民 37.0 20 1004 html5与css3 王晓 67.5 13 1005 Android程序计 王霖 79.3 25 ``` 需要注意的是,浮点数的比较和输出可能会存在精度问题,可以使用一些技巧来解决,如四舍五入等。另外,表格输出可以使用格式化输出来控制对齐等格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值