• 算法-搜索(1)静态搜索


     顺序表、搜索表的类定义以及顺序搜索:

    #include <iostream>
    #include <assert.h>
    using namespace std;
    const int defaultSize=100;
    
    template <class E,class K>
    class dataList;  //数据表类的前视定义
    
    template <class E,class K>
    class dataNode{    //数据表中结点类的定义
        friend class dataList<E,K>;    //声明友元类为dataList
    public:
        dataNode(const K x):key(x){}
        K getKey()const{return key;}    //表的存储结构封装在类的私有或保护部分
        void setKey(K k){key=k;}        //通过getKey()和setKey()函数对关键码进行存取
    private:
        K key;
    };
    
    template <class E,class K>
    class dataList{     //数据表类定义
    public:
        dataList(int sz=defaultSize):ArraySize(sz),CurrentSize(0){
            Element=new dataNode<E,K>[sz];
            assert(Element!=NULL);
        }
        dataList(dataList<E,K>& R);
        virtual ~dataList(){delete []Element;}
        virtual  int Length(){return CurrentSize;}
        virtual K getKey(int i)const{    //提取第i个元素的值,i从1开始
            assert(i>0||i<=CurrentSize);
            return Element[i-1].key;
        }
        virtual void setKey(K x,int i){  //修改第i个元素的值,i从1开始
            assert(i>0||i<=CurrentSize);
            Element[i-1].key=x;
        }
        virtual int SeqSearch(const K x)const;
        virtual int SeqSearch(const K x,int loc)const;
        virtual bool Remove(const K x,E& el);
        virtual bool Insert(E& el);
        friend ostream& operator<<(ostream& out,const dataList<E,K>& OutList);
        friend istream& operator>>(istream& in,dataList<E,K>& InList);
    private:
        dataNode<E,K> *Element;
        int ArraySize,CurrentSize;
    };
    
    template <class E,class K>
    class searchList:public dataList<E,K>{
        //搜索表类继承dataList,并且增加了成员函数Search()
    public:
        searchList(int sz=defaultSize):dataList<E,K>(sz){}
        virtual int SeqSearch(const K x)const;
    };
    
    template <class E,class K>
    bool dataList<E,K>::Insert(E& el){
        if(CurrentSize==ArraySize) return false;
        Element[CurrentSize]=el;        //在dataList尾部插入元素el
        CurrentSize++;
        return true;
    };
    
    template <class E,class K>
    bool dataList<E,K>::Remove(const K x,E& el){
        if(CurrentSize==0) return false;
        int i;
        for (i = 0; i <CurrentSize&&Element[i].key!=x; i++);
        if(i==CurrentSize) return false;
        el=Element[i];
        Element[i]=Element[CurrentSize-1];   //用尾元素填充被删除元素
        CurrentSize--;
        return true;
    }
    
    template <class E,class K>
    ostream& operator<<(ostream& out, const dataList<E,K>& OutList){
        out<<"Array Contents:
    ";
        for (int i = 1; i <=OutList.CurrentSize; i++) out<<OutList.Element[i-1].getKey()<<'';
        out<<endl;.
        out<<"Array Current Size:"<<OutList.CurrentSize<<endl;
        return out;
    };
    
    template <class E,class K>
    istream& operator>>(istream& in,dataList<E,K>& InList){
        cout<<"Enter array Current Size:";
        in>>InList.CurrentSize;
        cout<<"Enter array elements:
    ";
        for (int i = 1; i <=InList.CurrentSize; i++) {
            cout<<"Element"<<i<<"i";
            in>>InList.Element[i-1];     
        }
        return in;
    };
    
    template <class E,class K>
    int searchList<E,K>::SeqSearch(const K x) const {
        //使用监视哨的顺序搜索算法,第CurrentSize号位置作为控制搜索过程自动结束第监视哨使用
        Element[CurrentSize].key=x;  //将x设置为监视哨
        int i=0;
        while(Element[i].key!=x) i++;
        return i+1;
    }
    
    template <class E,class K>
    int searchList<E,K>::SeqSearch(const K x,int loc)const{
        //顺序搜索的递归算法,从第loc个元素开始搜索
        if(loc>CurrentSize) return 0;   //先判断是否检测到表尾,此时loc停留在CurrentSize+1的位置。搜索不成功,返回0
        else if(Element[loc-1].key==x) return loc;
        else return SeqSearch1(x,loc+1);
    }
    
    const int Size=10;
    main(){
        searchList<int>L1(Size);
        int Target;
        int Location;
        cin>>L1;
        cout<<L1;
        cout<<"Search for a integer:";
        cin>>Target;    //输入要搜索的数据
        if((Location=L1.Seqsearch(Target))!=L1.Length()) cout<<"Found at index"<<Location<<endl;
        else cout<<"Not found.
    ";
    }

    基于有序顺序表的顺序搜索和折半搜索:

    #include "SeqList.h"
    template <class E,class K>
    class SortedList:public SearchList<E,K>{
    public:
        SortedList(int sz=100):SearchList<E,K>(sz){}
        ~SortedList(){}
        int SequentSearch(const K x)const;
        int BinarySearch(const K x)const;
        int BinarySearch(const K x,int low,int high);
        bool Insert(const E& el);
        int Begin(){return(CurrentSize==0)?0:1;}
        int Next(int i){return(i>=1&&&i<=CurrentSize)?i+1:0;}
    }
    
    template <class E,class K>
    int SortedList<E,K>::SequentSearch(const K x)const{
        for(int i=1;i<=CurrentSize;i++){
            if(Element[i-1].key==x) return i;
            else if(Element[i-1].key>x) break;
        }
        return 0;  //顺序搜索失败,且x大于所有关键码
    }
    
    template <class E,class K>
    int SortedList<E,K>::BinarySearch(const K x)const{
        //迭代算法
        int high=CurrentSize-1,low=0,mid;
        while(low<=high){
            mid=(low+high)/2;
            if(x>Element[mid].key) low=mid+1;
            else if(x<Element[mid].key) high=mid-1;
            else return mid+1;  //搜索成功
        }
        return 0;  //搜索失败
    }
    
    template <class E,class K>
    int SortedList<E,K>::BinarySearch(const K x,int low,int high){
        //递归算法
        int mid=0;
        if(low<=high){
            mid=(low+high)/2;
            if(x>Element[mid-1].key) mid=BinarySearch(x,mid+1,high);
            else if(x<Element[i-1].key) mid=BinarySearch(x,low,mid-1);
        }
        return mid;
    }
    
    template <class E,class K>
    void SortedList<E,K>::Insert(const E& el)const{
        assert(CurrentSize<ArraySize);
        while(i<=CurrentSize&&Element[i-1].key<=el.key) i++;
        for(int j=CurrentSize;j>=i;j--) Element[j]=Element[j-1];
        Element[i-1]=el;
        CurrentSize++;
    }
  • 相关阅读:
    (Java实现) 数塔问题
    (Java实现) 数塔问题
    Java实现 蓝桥杯VIP 算法训练 数的划分
    Java实现 蓝桥杯VIP 算法训练 数的划分
    (Java实现) 细胞
    理解ATL中的一些汇编代码(通过Thunk技术来调用类成员函数)
    一些常见的国际标准化组织
    Windows开发中一些常用的辅助工具
    如何分析程序的时间消耗
    C++代码覆盖率工具Coverage Validator
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9236216.html
Copyright © 2020-2023  润新知