数据结构与算法-二分查找

  • 条件:数据结构是顺序存储结构且有序,就可以使用 二分查找 去找到特定的数据。不有序,则先使用排序算法。

  • 题目:洛谷 二分查找模板题

  • 原理:首先找到这串数字中间位置的那个数,然后与需要查询的数比较
    如果要查询的数小于中间那个数,那么答案肯定在左边
    如果要查询的数大于中间那个数,那么答案肯定在右边
    如果等于的话继续在左边找,因为找到的位置还不能确定是第一个数
    如此重复,直到要查询的区域变为1。参见原话

  • 代码:

    /**
    * 二分查找
    */
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    using namespace std;
    class Player {
    private:
    	//通用属性
    	static const int MaxN = int(1e7);
    private:
    	//个例属性
    	int n, m;
    	int a[MaxN];
    private:
    	//个例方法
    	int BinaryFind(int a[],int n,int num) {
    		int res = -1;
    		int left, right, mid;
    		left = 1, right = n;
    		while (left <= right) {
    			mid = (left + right) / 2;
    			if (num > a[mid]) {
    				left = mid + 1;
    			}
    			else {
    				//因为从左找第一个符合的数
    				if (num == a[mid]) {
    					res = mid;
    				}
    				right = mid - 1;
    			}
    		}
    		return res;
    	}
    private:
    	//通用方法
    	void BeginPlay() {
    		cin >> n >> m;
    		for (int i = 1; i <= n; ++i) {
    			cin >> a[i];
    		}
    	}
    	void Playing() {
    		int num;
    		while (m--) {
    			cin >> num;
    			cout << BinaryFind(a,n,num) << " ";
    		}
    	}
    	void EndPlay() {
    
    	}
    public:
    	//通用方法
    	void Play() {
    		BeginPlay();
    		Playing();
    		EndPlay();
    	}
    };
    
    Player Moota;
    int main() {
    	Moota.Play();
    }
    

你可能感兴趣的:(数据结构与算法,数据结构,算法)