二分查找(划分时左右元素个数不相等)解析+代码
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                二分查找(划分时左右元素个数不相等)解析+代码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                一:問題描述
當我們在用二分法查找元素的時候,我們往往特希望遇到是奇數個元素個數的數組,因為劃分完左右兩邊的個數相等,所以在以前剛學二分法的時候就有這個疑問,當時就是模模糊糊過去了,再遇到其實還是會有疑問?,F在實例驗證遇見偶數個數數組元素個數時的二分法
二:思路+示例
目標:查詢數組當中是否存在某個數,存在返回其下標,不存在返回-1;
思路:1.這是一個很典型的二分查找的例子,但關鍵的是我們要考慮其中的符號問題
 2.也就是左閉右閉,左閉右開,左開右閉,這是二分法的重點,
 3.我們一般使用的是左閉右閉,即[left,right],
 舉例如:
 輸入偶數個的數組array[7]: 我們想要查詢29是否存在
 1 5 9 11 23 29 31 50
三:上碼
/**目標:查詢數組當中是否存在某個數,存在返回其下標,不存在返回-1;思路:1.這是一個很典型的二分查找的例子,但關鍵的是我們要考慮其中的符號問題2.也就是左閉右閉,左閉右開,左開右閉,這是二分法的重點,3.我們一般使用的是左閉右閉,即[left,right],舉例如:輸入偶數個的數組array[7]: 我們想要查詢29是否存在 1 5 9 11 23 29 31 50 1>:我們在選取middle時 middle = 7/2 = 3 取下標為3的元素也就是11,2>:這時劃分的數組左右長度不一樣,跟我們常規的奇數個的時候不一樣,這時我們對左右兩邊個數的考慮是多余的,因為我們每次都是將middle左邊(右邊)的所有元素均排除,跟個數完全沒有關系,3>:回到上方的例子當中,我們比較29和11的時候直接將左邊的所有元素pass掉 下一次比較[middle+1,right]當中的元素,這里左右兩邊均取閉區間即左閉右閉 **/ #include<bits/stdc++.h> using namespace std;int find(int a[],int size,int target){int left = 0;int right = size - 1;//因為采用的左閉右閉,比如a[5],那么左右邊界就是[0,4] int mid;while(left <= right){ //當left == right時候 左閉右閉依然有效mid = left + (right - left)/2;//這里等價于 (right + left)/2if(a[mid] > target){right = mid - 1;}else if (a[mid] < target){left = mid + 1;}else{return mid;}}return -1;//沒找到 }int main(){int a[10];int N,target;//N個數和要查詢的數 cin >> N >> target;for(int i = 0; i < N; i++){cin >> a[i];} int res = find(a,N,target);cout << res; }四:補充左閉右開
1:左閉右開[left,right)
即相應的while條件中(left < right) 而當a[mid] > target;時候,對應的 right = mid;
上碼:
int search(int nums[], int size, int target) {int left = 0;int right = size; //定義target在左閉右開的區間里,即[left, right)while (left < right) { //因為left = right的時候,在[left, right)區間上無意義int middle = left + ((right - left) / 2);if (nums[middle] > target) {right = middle; //target 在左區間,在[left, middle)中 } else if (nums[middle] < target) {left = middle + 1;} else {return middle;}} // 沒找到就返回-1return -1; }參考自
總結
以上是生活随笔為你收集整理的二分查找(划分时左右元素个数不相等)解析+代码的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 麦苗榨汁的功效与作用、禁忌和食用方法
 - 下一篇: 69. Sqrt(x)010(二分法求解