折半查找
對於關鍵碼有序的數列,用二分法查找。
比如123456789,要找2,先折半找5,2比5小,繼續向左查找,找3,2比3小,繼續向左查找,2匹配成功。
可以想到這是個遞歸的過程我這里遞歸非遞歸都寫一遍。
首先是非遞歸的算法。
- 傳入一個vector<int> &v和一個 待查找數值k
- 設定查找的下界=0;上界為v.size();
- 開始循環,跳出循環有2種情況,1找到了數值,2-就是下界比上界大的情況
- 這里開始while(下界<=上界)
- {
- 設置中界為(上界+下界)/2
- if(待查值小於中間值)就把上界設置為中間位置-1
- else if(待查值大於中間值)就把下界設置為中間位置+1
- else 這種情況就是查找到了直接return mid中間位置就行
- }
-
int search(vector<int>& v,int k) { int low=0,high=v.size(); while(low<=high) { int mid=(low+high)/2; if(k<v[mid])high=mid-1; else if(k>v[mid])low=mid+1; else return mid; } }
接着是遞歸算法,遞歸和非遞歸一個思想
- 因為是遞歸很容易想到,參數要4個,1-傳入數組,2-傳入下界,3-傳入上界,4-待查數字
- 遞歸邊界也像上面非遞歸一樣,low>high或者找到的時候
- int bin_search(vector<int>& v,int low,int high,int k)
- 如果high<low return 0;//沒找到的
- else{中間位置=(low+high)/2;
- 假如待查值小於中間值,則 遞歸調用return bin_search(v,low,mid-1,k)
- 假如待查值大於中間值,則遞歸調用return bin_search(v,mid+1,high,k)
- 找到值return mid;
-
int bin_search(vector<int>& v,int low,int high,int k) { if(low>high)return 0; else { int mid=(low+high)/2; if(k<v[mid])return bin_search(v,low,mid-1,k); else if(k>v[mid])return bin_search(v,mid+1,high,k); else return mid; } }
//要調用就是int i=bin_search(v,0,v.size(),待查值即可).
和折半查找類似的是二叉排序樹查找
- 明顯,二叉數的查找肯定是遞歸。這里默認都會二叉排序樹的構建。
- 和上面遞歸的查找沒啥區別。
- 直接上代碼
-
BiNode<int>* bt_search(BiNode<int> *&root,int k) { if(root==NULL)return NULL; else if(root->data==k)return root; else if(root->data>k)return bt_search(root->rightchild,k); else return bt_search(root->leftchild,k); }