一.二分查詢基本思想
在有序的序列裡,先將目標和中間的數值比較,如果大於中間數值,則在後半段的中間繼續比對;如果小於中間數值,則在前半段的中間繼續比對。以此類推,直至找到目標,或者結束查詢沒有找到。
二.關鍵條件
(1)有序序列
(2)順序儲存結構
三.時間複雜度
o(logn)
四.優點和不足
優點是比較次數少,查詢速度快,平均效能好;
缺點是要求待查表為有序表,且插入刪除困難
五.**示例:(下面例子皆以公升序為例)
1.最基本的二分查詢:
int binarysearch(int arr,int arr_l,int n)
else if(n這裡有幾個問題需要注意:
1.迴圈判定的條件:min<=max(如果直接是min2.為了防止資料溢位:mid=min+(max-min)/2
3.當n!=arr[mid]時,min=mid+1,max=mid-1
2.遞迴實現二分查詢
//遞迴二分查詢
int binarysearch2(int arr,int high,int low,int n)
if(n==arr[mid])
else if(n>arr[mid])
else
}
需要注意的問題同上。
3.二分法的幾種變形
(1)查詢目標值區域的左邊界(查詢與目標值相等的第乙個位置)(查詢第乙個不小於目標值數的位置)
//查詢目標值區域的左邊界(查詢與目標值相等的第乙個位置)(查詢第乙個不小於目標值數的位置)
int binarysearch(int arr,int arr_l,int n)
else
}if(min(2)查詢目標值區域的右邊界(查詢與目標值相等的最後乙個位置)(查詢最後乙個不大於目標值數的位置)
//查詢目標值區域的右邊界(查詢與目標值相等的最後乙個位置)(查詢最後乙個不大於目標值數的位置)
int binarysearch(int arr,int arr_l,int n)
else
}if(max>0&&arr[max]==n)
else
}
(3)查詢第乙個大於目標值的數/查詢比目標值大但是最接近目標值的數的位置(第二題變形)
int binarysearch(int arr,int arr_l,int n)
else
}return low注意此處就是大於目標值的最後一位,也就是max+1,也就是退出迴圈的 min
(4)查詢最後乙個小於目標值的數/查詢比目標值小但是最接近目標值的數的位置(第(1)題變形)
int binarysearch(int arr,int arr_l,int n)
else
}return max>0?max:-1;
}
(6).旋轉陣列(無重複項)
(什麼是旋轉陣列:將一組有序的序列左移,將移出來的部分依次連線到原序列後邊(1 2 3 4 5--------->4 5 1 2 3))
int findmin(int arr,int n)
while(leftarr[right])
else
}return arr[left];
}
和二分法的區別:(1)條件是right(2)如果arr[mid](7)旋轉陣列(有重複項)
int findmin(int arr,int n)
while(leftarr[right])
else if(arr[mid]區別就是當arr[mid]==arr[right]時,不知道最小值在右邊還是左邊,就讓right-1;
(8)旋轉序列中搜尋(不含重複項)
int search(int arr,int arr_l,int n)
while(leftarr[right])
else
}offset=left;
left=0,right=arr_l-1;
while(left<=right)
else if(n>arr[remid])
else
}return -1;
}
先找到最小的值,即找到分界點,然後根據remid=(mid+offset)%len求得真實的mid位置,即arr[remid]是有序序列的中點,arr[mid]為當前序列的中點(旋轉陣列),因此特別需要注意二分查詢時left=mid+1,而不是left=remid+1;
不需要找分界點的方法:
int search(int arr,int arr_l,int n)
while(left<=right)
else if(arr[left]<=arr[mid])//從這裡直接判斷
else
}else if(arr[mid]<=arr[right])
else
}} return -1;
}
(9)旋轉序列中搜尋(有重複項)
int search(int arr,int arr_l,int n)
while(left<=right)
else if(arr[mid]>arr[left])
else
}else if(arr[mid]arr[mid]&&n<=arr[right])
else
}else
}return -1;
}
待補充:二維陣列中的查詢
練習題目:
-ii/
二分查詢 折半查詢 演算法
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成前 後兩個子...
演算法 二分查詢(折半查詢)
二分查詢也稱折半查詢 binary search 它是一種效率較高的查詢方法。使用二分查詢的條件 1.必須採用順序儲存結構。2.必須按關鍵字大小有序排列。通俗一點的說 如果資料是乙個陣列,那麼這個陣列必須是有序的 時間複雜度 o log2n 如圖所示 下面我們來看c語言 include非遞迴實現 v...
折半查詢 二分查詢 演算法
順序查詢的優點是演算法簡單,表中對有序性無要求,但是查詢效率比較低。折半查詢跟普通的順序查詢的區別是 折半查詢要求表中的元素是有序的,並且是採用順序儲存的,不能是鏈式儲存的。折半查詢的主要思路是 在有序的表中,取得表中的中間記錄進行比較。如果給定查詢的值和中間記錄相等,就表示查詢成功 如果給定查詢的...