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; } }