1. 程式人生 > 實用技巧 >二分查詢(解決資料重複值問題)

二分查詢(解決資料重複值問題)

1、二分查詢介紹

  二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列、

2、查詢過程

  首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、

  後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

3、實現程式碼

import java.util.ArrayList;
import
java.util.List; /** * 我們在進行二分查詢查詢資料的時候,如果有兩個重複值,就會出現找到了第二個值的下標 * 並不能將兩個相同元素的下標都找出來。 */ public class Test03_二分查詢的改進演算法 { public static void main(String[] args) { int[] arr = {1, 2, 3, 5, 6, 6,6, 6, 7, 8, 9}; List<Integer> index = binarySearch(arr, 6); boolean empty = index.isEmpty(); System.out.println(empty
? "不好意思,沒有找到要進行檢索的元素" : "您找到的元素下標為:" + index + ""); } /** * 改進後的二分查詢 */ public static List<Integer> binarySearch(int[] arr, int val) { List<Integer> indexList = new ArrayList<>();//用於接收返回的元素下標 //陣列的開始以及結束下標 int begin = 0; int end = arr.length - 1;
while (begin < end) { int mid = (begin + end) / 2; if (arr[mid] < val) begin = mid + 1; else if (arr[mid] > val) end = mid - 1; else { //表示arr[mid] == val /*思路分析 1.在找到mid索引值,不要馬上返回 2.向mid索引值的左邊掃描,將所有滿足1000,的元素的下標, 加入到集合ArrayList 3.向mid索引值的右邊掃描,將所有滿足1000, 的元素的下標,加入到集合ArrayList 4.將ArrayList返回*/ //向mid左邊掃描 int temp = mid - 1; while (true) { if (temp < 0 || arr[temp] != val)//沒有找到就退出迴圈 break; //執行到這裡說明找到了,就把找到的元素新增到集合中,繼續向左找 indexList.add(temp); temp -= 1; } indexList.add(mid);//加入已經找到了的元素【arr[mid]==val】 //向mid右邊掃描 temp = mid + 1; while (true) { if (temp > arr.length - 1 || arr[temp] != val) break; //執行到這裡說明找到了,就把找到的元素新增到集合中,繼續向右 indexList.add(temp); temp += 1; } return indexList; } } return indexList; } }