日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java语言实现二分查找(可查询重复数据)

發布時間:2025/3/21 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言实现二分查找(可查询重复数据)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。