java二分查詢,折半查詢演算法
阿新 • • 發佈:2018-12-09
二分查詢是一個較為簡單的查詢演算法.要求所查資料集合必須為有序的.也因此,註定了這種資料結構在插入方面的xing效能很差(因為要移動引用位置,騰出空間來,在javali裡面,由於資料存的是引用.所以影響不大);
具體思路是: 在一個有序集合中,確定中間位置的值middleIndex位置.然後這個位置的值和要查詢的目標target進行比較, 如果小於target,說明middleIndex位置左邊的數都小於target.那麼將開始位置的下標設定為middleIndex. 即startIndex=middleIndex; 然後再來根據新的startIndex和endIndex算出一個新的middleIndex值. 如果target小於middleIndex位置的值.說明middleIndex右邊的數都是大於target的.那麼將endIndex設定為middleIndex. 重複上面的操作, 直到2者相等或者startIndex=endIndex...
然後補充下上面邏輯會漏掉的情況,就是集合裡面只有一個數的情況. 這種情況下單獨抽離出來;
-------------------------------------------------
上面那種查詢針對的是集合裡面不會有重複資料的情況. 如果有重複資料, 那麼在第一次找到target的時候, 後面繼續用二分查詢很不划算(因為在有序集合中,相同的數一定是相鄰的), 所以這種情況下, 只需將middleIndex -1 或者middleIndex + 1就可以了;同時,這種方法還不會重複查詢已經找到過的資料.
public void binarySearch() { // int[] a = new int[] {1,2,3,7,7,7,7,8,9}; int[] a = new int[]{7,7,7,7,7,7,7,7,7,7}; int target = 7; int startIndex = 0; int endIndex = a.length - 1; int middleIndex = (startIndex + endIndex) / 2; /** 重複值查詢邏輯*/ int lowIndex = 0; int upperIndex = 0; while (startIndex < endIndex && startIndex < middleIndex) { if (target > a[middleIndex]) { startIndex = middleIndex; middleIndex = (startIndex + endIndex) / 2; } else if (target < a[middleIndex]) { endIndex = middleIndex; middleIndex = (startIndex + endIndex) / 2; } else { System.out.println(middleIndex); /** 有重複值查詢邏輯*/ lowIndex = middleIndex; upperIndex = middleIndex; while (startIndex <= middleIndex - 1) { middleIndex = middleIndex - 1; if (target == a[middleIndex]) { System.out.println(middleIndex); } } middleIndex = upperIndex; while (endIndex >= middleIndex + 1) { middleIndex = middleIndex + 1; if (target == a[middleIndex]) { System.out.println(middleIndex); } } return; } } /** 只有一個數的情況*/ if (target == a[middleIndex]) { System.out.println(middleIndex); } }