数组与二分查找

#include <iostream>
#include <cstdio>

using namespace std;

int binary_serach(int [], int , int );
int lower_bound(int [], int , int );
int upper_bound(int [], int , int );
int find_miss_NO(int [], int);


int main()
{
    /*
    给定有序整数数组a[]和整数x,返回x在数组a[]中出现次数
    【解题思路】
    两次二分查找,分别求出upper_bound(x)和lower_bound(x),返回两者之差即可
    */
    int a[10] = {1, 2, 3, 4, 4, 4, 5, 6, 6, 7};
    cout << upper_bound(a, 10, 4) - lower_bound(a, 10, 4) << endl;


    /*
    一个sorted interger Array[1...N], 已知范围 1...N+1. 已知一个数字missing。 找该数字。比如
    Array[]={1, 2, 3, 5, 6},则missing的数为4。
    【解题思路】
    典型的二分查找,如果Array[i]=i,则向右查找,否则向左查找。如果采用C++实现,由于下标从0开始,则需作适当修改。
    */
    int b[] = {1, 2, 3, 4, 6};
    cout << find_miss_NO(b, 5) << endl;

    return 0;
}

int binary_serach(int a[], int n, int x)
{//找到x在a[]中的位置,不存在返回-1
    int low = 0, high = n - 1, mid;
    while(high >= low)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] == x)
            return mid;
        else if(a[mid] < x)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return -1;
}

int lower_bound(int a[], int n ,int x)
{//lower_bound,即下界,找到大于等于x的第一个元素
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] >= x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}

int upper_bound(int a[], int n, int x)
{//upper_bound, 上界,找到大于x的第一个元素
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);//防止溢出
        if(a[mid] > x)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return low;
}

int find_miss_NO(int a[], int n)
{
    /*
    一个sorted interger Array[1...N], 已知范围 1...N+1. 已知一个数字missing。 找该数字。比如
    Array[]={1, 2, 3, 5, 6},则missing的数为4。
    【解题思路】
    典型的二分查找,如果Array[i]=i,则向右查找,否则向左查找。如果采用C++实现,由于下标从0开始,则需作适当修改。
    */
    int low = 0, high = n - 1, mid;
    while(low <= high)
    {
        mid = low + ((high - low) >> 1);
        if(a[mid - 1] == mid)
            low = mid + 1;
        else
            high = mid - 1;
    }
    return low;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值