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