Java语言实现二分查找(可查询重复数据)
生活随笔
收集整理的這篇文章主要介紹了
Java语言实现二分查找(可查询重复数据)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 二分查找
- 1.前言
- 2.算法思想
- 3.圖示
- 4.優缺點
- 5.代碼實現
- 標準二分查找
- 拓展:可以查詢重復值
二分查找
1.前言
二分查找是一種查詢效率非常高的查找算法,又稱為折半查找。
用遞歸思想來實現二分查找較為形象并且代碼可讀性強,因此本文中將介紹二分查找的思想,代碼實現以及重復值查找的拓展。
2.算法思想
使用二分查找的前提是在一組有序的序列下進行,每次以序列的中間位置的數作為標準與帶查找的數進行比較,從而調整查找方向,并且縮小查找范圍,直至匹配成功。
3.圖示
4.優缺點
- 優點:比較次數少,查找速度快,平均性能較好
- 缺點:要求待查表為有序表,并且插入刪除困難
因此二分查找適用于不經常變動且查找頻繁的有序列表。
5.代碼實現
標準二分查找
/**** @param array 有序數組* @param left 左邊的索引* @param right 右邊的索引* @param findValue 要查找的值* @return 如果找到返回下標 否則返回-1*/ public static int binarySearch(int[] array,int left,int right,int findValue) {//更新mid值從而縮小查找范圍int mid = (left + right)/2;//作為查找標準 通過比較midValue和findValue來調整查找方向int midValue = array[mid];//遞歸終止條件//-->當left索引值移動至right右方則說明該序列表已經查找完畢,但仍然未匹配到相等的值if (left > right){return -1;}//查找的值在標準值右方if (findValue > midValue){//調整left值,向右遞歸return binarySearch(array, mid+1, right, findValue);}//查找的值在標準值左方else if (findValue < midValue){//調整right值,向左遞歸return binarySearch(array, left, mid-1, findValue);}//匹配成功else{//返回索引值return mid;} }測試
/*** 二分查找的前提:數組是有序的* @param args*/ public static void main(String[] args) {int[] array = {1,8,10,89,1000,1989};int index = binarySearch(array, 0, array.length-1, 1000);System.out.println(index); }//---------------------------------------------------測試結果------------------------------------------------------ 待查找的值為1000,在該序列中的索引值為:4拓展:可以查詢重復值
/*** 思路分析:* 1.在找到查找的值的索引值時不要立刻返回索引* 2.在索引值左邊進行遍歷,將所有等于當前索引值的元素下表添加到集合ArrayList中* 3.在索引值右邊進行遍歷,將所有等于當前索引值的元素下表添加到集合ArrayList中* 4.返回ArrayList* @param array 數組* @param left 左邊的索引* @param right 右邊的索引* @param findValue 要查找的值* @return 如果找到返回下標 否則返回-1*/ public static List<Integer> binarySearchMut(int[] array,int left,int right,int findValue) {int mid = (left + right)/2;int midValue = array[mid];//存儲索引值的列表ArrayList<Integer> arrayList = new ArrayList<>();if (left > right){//如果沒有找到值返回-1arrayList.add(-1);return arrayList;}if (findValue > midValue){return binarySearchMut(array, mid+1, right, findValue);}else if (findValue < midValue){return binarySearchMut(array, left, mid-1, findValue);}else{//用于左右遍歷查找相同值的輔助遍歷指針int temp = mid - 1;//向左遍歷while (true){if (temp < 0 || array[temp] != midValue){break;}arrayList.add(temp);temp--;}arrayList.add(mid);temp = mid + 1;//向右遍歷while (true){if (temp > array.length - 1 || array[temp] != midValue){break;}arrayList.add(temp);temp++;}return arrayList;} }以上。
如有不足或錯誤歡迎評論指正。
總結
以上是生活随笔為你收集整理的Java语言实现二分查找(可查询重复数据)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归回溯解决八皇后问题
- 下一篇: Java语言实现插值查找