数据结构C++版 王红梅 OJ习题

1030: 折半查找(递归实现)*

Description

/*已知折半查找的部分代码如下,勿改动。请补充实现折半查找算法Bin_Search。

要求:实现方式为递归方法。

*/



#include<iostream>

using namespace std;



const int MaxSize=100; //顺序表的最大长度

//有序表类

class LinearSearch{

public:

LinearSearch(){n=0;}

~LinearSearch(){}

void Insert(int x);//有序表的插入,使序列仍有序

void DispList(); //输出表

int Bin_Search(int key); //调用下面的递归算法

int Bin_Search(int low, int high, int key); //递归算法,成功返回位置,否则返回0

private:

int r[MaxSize+1]; //存储元素(r[1]~r[n]存储元素)

int n;   //顺序表实际长度

};





//在有序表中插入元素x,使序列仍有序

void LinearSearch::Insert(int x){

    int i;

if (n>=MaxSize)         //表满不能插入

throw "Overflow";

r[0]=x;

for(i=n;r[i]>x;i--)

r[i+1]=r[i];//将i位置元素后移

    r[i+1]=x;                 //在位置i+1插入元素x

    n++;                    //线性表长度增1

}

void LinearSearch::DispList() //输出表

{

    int i;

    cout<<"Data:";

    for(i=1;i<=n;i++)

    {

        cout<<r[i]<<" ";

    }

    cout<<endl;

}

//在下面补充实现折半查找算法(两个函数Bin_Search,1个形参和3个形参的各一个)

int main(){

LinearSearch A;  //空表A

int x,key;

//利用插入函数创建有序表,以0结束

while(1){

cin>>x;

if(!x)break;

try{

A.Insert(x);

}

catch(char *wrong){

cout<<wrong<<endl;

}

}

A.DispList();

int pos;

cin>>key;

pos=A.Bin_Search(key);

if(!pos)//查找失败

cout<<"Find "<<key<<" failure\n";

else cout<<"Find "<<key<<" success,position:"<<pos<<endl;

return 0;

}

Input

输入数据以0结束

Output

注意测试查找成功及失败两种情况

Sample Input

43 53 1 25 2 426 324 345 423 34 0 43

Sample Output

Data:1 2 25 34 43 53 324 345 423 426 
Find 43 success,position:5
//
// Created by Legends丶Hu on 2021/4/19.
//

#include<iostream>
using namespace std;

const int MaxSize=100; //顺序表的最大长度
//有序表类
class LinearSearch{
public:
    LinearSearch(){n=0;}
    ~LinearSearch(){}
    void Insert(int x);//有序表的插入,使序列仍有序
    void DispList(); //输出表
    int Bin_Search(int key); //调用下面的递归算法
    int Bin_Search(int low, int high, int key); //递归算法,成功返回位置,否则返回0
private:
    int r[MaxSize+1]; //存储元素(r[1]~r[n]存储元素)
    int n;   //顺序表实际长度
};


//在有序表中插入元素x,使序列仍有序
void LinearSearch::Insert(int x){
    int i;
    if (n>=MaxSize)         //表满不能插入
        throw "Overflow";
    r[0]=x;
    for(i=n;r[i]>x;i--)
        r[i+1]=r[i];//将i位置元素后移
    r[i+1]=x;                 //在位置i+1插入元素x
    n++;                    //线性表长度增1
}
void LinearSearch::DispList() //输出表
{
    int i;
    cout<<"Data:";
    for(i=1;i<=n;i++)
    {
        cout<<r[i]<<" ";
    }
    cout<<endl;
}

int LinearSearch::Bin_Search(int low, int high, int key) {
    if(low > high)
        return 0;
    int mid = (low + high) >> 1;
    if(r[mid] > key)
        return Bin_Search(low, mid - 1, key);
    else if(r[mid] < key)
        return Bin_Search(mid + 1, high, key);
    return mid;
}

int LinearSearch::Bin_Search(int key) {
    return Bin_Search(1 , n, key);
}

//在下面补充实现折半查找算法(两个函数Bin_Search,1个形参和3个形参的各一个)
int main(){
    LinearSearch A;  //空表A
    int x,key;
    //利用插入函数创建有序表,以0结束
    while(1){
        cin>>x;
        if(!x)break;
        try{
            A.Insert(x);
        }
        catch(char *wrong){
            cout<<wrong<<endl;
        }
    }
    A.DispList();
    int pos;
    cin>>key;
    pos=A.Bin_Search(key);
    if(!pos)//查找失败
        cout<<"Find "<<key<<" failure\n";
    else cout<<"Find "<<key<<" success,position:"<<pos<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值