数据结构顺序查找与二分法

参考书籍:数据结构与算法分析(C++)(第二版)中文版.pdf

例3.1 下面是查找一维n元整数数组中最大元素的算法。该算法依次遍历数组的元素,并保存当前的最大元素,称为“最大元素顺序搜索”。下面就是使用C++语言编写的程序

#include <iostream>
using namespace std;

int largest(int array[],int n)
{
    int currlarge = 0;
    
    for (int i=1; i<n; i++)
        if(array[currlarge]<array[i])
            currlarge = i;
    return currlarge;
}

int main()
{
    int a[10]= {35,78,10,50,99,34,65,24,64,23};
    int n=sizeof(a)/sizeof(int);
    
    for (int i=0; i<n; i++)
        cout << a[i] << " " ;
    cout << endl;
    cout << "The largest position" << endl;
    cout << largest(a,n) << endl;
    cout << "The largest number" << endl;
    cout << a[largest(a,n)] << endl;
    return 0;
}
二分法程序

#include <iostream>
using namespace std;

int binary(int array[], int n, int K){
    int l = -1;
    int r = n;
    while(l+1 != r){
        int i= (l+r)/2;
        if (K < array[i]) r = i;
        if (K == array[i]) return i;
        if (K > array[i]) l=i;
    }
    return n;
}

int main()
{
    int a[16]= {11,13,21,26,29,36,40,41,45,51,54,56,65,72,77,83};
    int n=sizeof(a)/sizeof(int);

    for (int i=0; i<n; i++)
        cout << a[i] << " " ;
    cout << endl;
    cout << "The search position" << endl;
    cout << binary(a,n,45) << endl;
    return 0;
}
3.16改进二分法,有重复元素是返回第一个下标

#include <iostream>
using namespace std;

int binary(int array[], int n, int K)
{
    int l = -1;
    int r = n;
    int flag = 0;
    while(l+1 != r)
    {
        int i= (l+r)/2;
        if (K < array[i]) r = i;
        if (K == array[i])
        {
            r = i;
            flag = 1;
        }
        if (K > array[i]) l=i;
    }
    if (flag)
        return r;
    else
        return n;
}

int main()
{
    int a[16]= {11,13,21,26,29,45,45,45,45,51,54,56,65,72,77,83};
    int n=sizeof(a)/sizeof(int);

    for (int i=0; i<n; i++)
        cout << a[i] << " " ;
    cout << endl;
    cout << "The search position" << endl;
    cout << binary(a,n,45) << endl;
    return 0;
}

3.17改进二分法,没有这个元素使找前一个元素

个人思路是两轮查找,一轮确定有没有这个元素,如果有,直接出结果,如果没有,找到前一个元素再查第二轮

#define ERROR -1
#include <iostream>
using namespace std;

int binary(int array[], int n, int K)
{
    int l = -1;
    int r = n;
    int flag = 0;
    if (K < array[0]) return ERROR;
    while(l+1 != r){
        int i= (l+r)/2;
        if (K < array[i]) r = i;
        //if (K == array[i]) return i;
        if (K == array[i])
        {
            l = i;
            flag = 1;
        }
        if (K > array[i]) l = i;
    }

    if (flag)
        return r;
    else
    {
        K = array[r-1];
        int l = -1;
        int r = n;
        while(l+1 != r)
        {
            int i= (l+r)/2;
            if (K < array[i]) r = i;
            if (K == array[i]) r = i;
            if (K > array[i]) l=i;
        }
        return r;
    }

}

int main()
{
    int a[16]= {11,13,21,26,29,45,45,45,45,51,54,56,65,72,77,83};
    int n=sizeof(a)/sizeof(int);

    for (int i=0; i<n; i++)
        cout << a[i] << " " ;
    cout << endl;
    cout << "The search position" << endl;
    cout << binary(a,n,10) << endl;
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值