Java 二分查找

二分查找又稱折半查找,它是一種效率較高的查找方法。算法

折半查找的算法思想是將數列按有序化(遞增或遞減)排列,查找過程當中採用跳躍式方式查找,即先以有序數列的中點位置爲比較對象,若是要找的元素值小於該中點元素,則將待查序列縮小爲左半部分,不然爲右半部分。經過一次比較,將查找區間縮小一半。 折半查找是一種高效的查找方法。它能夠明顯減小比較次數,提升查找效率。可是,折半查找的先決條件是查找表中的數據元素必須有序。數組

折半查找法的優勢是比較次數少,查找速度快,平均性能好;其缺點是要求待查表爲有序表,且插入刪除困難。所以,折半查找方法適用於不常常變更而查找頻繁的有序列表。性能

二分算法步驟描述:測試

1.肯定整個查找區間的中間位置 mid = ( left + right )/ 2spa

2.用待查關鍵字值與中間位置的關鍵字值進行比較;code

若相等,則查找成功對象

若大於,則在後(右)半個區域繼續進行折半查找blog

若小於,則在前(左)半個區域繼續進行折半查找io

3.對肯定的縮小區域再按折半公式,重複上述步驟。class

4.獲得結果:要麼查找成功, 要麼查找失敗。折半查找的存儲結構採用一維數組存放。 折半查找算法舉例

注意:查找失敗(即在查找內容中沒有你要找的),這時控制檯並不會報錯。

代碼實例:

package com.shuzu; public class Demo7 { public static void main(String[] args) { // TODO Auto-generated method stub // 測試,數組(有序,以升序序列爲例。這裏是園友留言,提示糾正的。)
        int arr[] = { 1, 3, 4, 7, 11, 16, 33, 43, 65, 77, 88, 90, 99, 110 }; BinaryFind bf = new BinaryFind(); bf.find(0, arr.length - 1, 33, arr); } } // 定義一個二分查找的類
class BinaryFind { public void find(int leftIndex, int rightIndex, int val, int arr[]) { // 首先找到中間的數,這裏不用擔憂。/表明取整。
//(以前的錯誤,被園友糾正:Java中,除不盡會自動取整)
int midIndex = (rightIndex + leftIndex) / 2; int midVal = arr[midIndex]; if (rightIndex >= leftIndex) { // 若是要找的數比midVal大 if (midVal > val) { // 在arr數組的左邊找 find(leftIndex, midIndex - 1, val, arr); } else if (midVal < val) { // 在arr數組的右邊找 find(midIndex + 1, rightIndex, val, arr); } else if (midVal ==val) { System.out.println("找到下標" + midIndex); } } } }

圖例演示原理:

相關文章
相關標籤/搜索