Java编程内功-数据结构与算法「二分查找非递归」

2025-05-29 0 50

Java编程内功-数据结构与算法「二分查找非递归」

基本介绍

1.二分查找只适用于从有序的数列中进行查找(比如数字和字母),将数列排序后再进行查找。

2.二分查找法的运行时间为对数时间O(log2n),即查找到需要的目标位置最多只需log2n步,假设从[0,99]的队列中寻找目标数30,则需要查找步数为log2(100),即最多需要7次(2^6<100<2^7)。

代码案例

  1. packagecom.xie.algorithm;
  2. publicclassBinarySearchNoRecur{
  3. publicstaticvoidmain(String[]args){
  4. int[]arr={1,3,8,10,11,67,100};
  5. intindex=binarySearch(arr,1);
  6. System.out.println("index="+index);
  7. }
  8. /**
  9. *二分查找非递归实现
  10. *
  11. *@paramarr待查找的数组,arr是升序排列
  12. *@paramtarget需要查找的数
  13. *@return返回对应的下标,-1表示没有找到
  14. */
  15. publicstaticintbinarySearch(int[]arr,inttarget){
  16. intleft=0;
  17. intright=arr.length-1;
  18. while(left<=right){
  19. intmid=(left+right)/2;
  20. if(arr[mid]==target){
  21. returnmid;
  22. }elseif(arr[mid]>target){
  23. //需要向左边查找
  24. right=mid-1;
  25. }else{
  26. //需要向右边查找;
  27. left=mid+1;
  28. }
  29. }
  30. return-1;
  31. }
  32. }

基本介绍

1.插值查找算法类似于二分查找,不同的是插值查找每次从自适应的mid处开始查找。

2.二分查找中求mid索引的公式转成插值查找mid索引公式,low表示左边的索引,high表示右边的索引,key表示要查找的值

Java编程内功-数据结构与算法「二分查找非递归」

代码案例

  1. packagecom.xie.search;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. publicclassInsertValueSearch{
  5. staticintcount=0;
  6. publicstaticvoidmain(String[]args){
  7. int[]arr=newint[102];
  8. arr[0]=1;
  9. arr[1]=1;
  10. for(inti=2;i<102;i++){
  11. arr[i]=i;
  12. }
  13. List<Integer>indexList=insertValueSearch(arr,0,arr.length-1,1);
  14. System.out.println("indexList="+indexList);
  15. System.out.println("查找次数:"+count);
  16. /*
  17. indexList=[1,0]
  18. 查找次数:1
  19. */
  20. }
  21. /**
  22. *插值查找,返回索引集合
  23. *
  24. *@paramarr数组
  25. *@paramleft左边索引
  26. *@paramright右边索引
  27. *@paramfindValue要查找的值
  28. *@return找到就返回所有索引的集合,没有就返回空
  29. */
  30. publicstaticList<Integer>insertValueSearch(int[]arr,intleft,intright,intfindValue){
  31. count++;
  32. List<Integer>indexList=newArrayList<Integer>();
  33. //注意:findValue<arr[0]||findValue>arr[arr.length-1]这个必须要,否则mid可能越界
  34. if(left>right||findValue<arr[0]||findValue>arr[arr.length-1]){
  35. returnnewArrayList<Integer>();
  36. }
  37. intmid=left+(rightleft)*(findValue-arr[left])/(arr[right]-arr[left]);
  38. intmidValue=arr[mid];
  39. if(findValue>midValue){
  40. returninsertValueSearch(arr,mid+1,right,findValue);
  41. }elseif(findValue<midValue){
  42. returninsertValueSearch(arr,left,mid-1,findValue);
  43. }else{
  44. //如果找到了,再向左扫描,将满足条件的加入indexList
  45. inttemp=mid-1;
  46. while(true){
  47. if(temp<0||arr[temp]!=findValue){
  48. break;
  49. }
  50. indexList.add(temp);
  51. temp–;
  52. }
  53. //再向右扫描,将满足条件的加入indexList
  54. temp=mid+1;
  55. while(true){
  56. if(temp>right||arr[temp]!=findValue){
  57. break;
  58. }
  59. indexList.add(temp);
  60. temp++;
  61. }
  62. indexList.add(mid);
  63. returnindexList;
  64. }
  65. }
  66. }

注意事项

  1. 对于数据量大,关键字分布比较均匀的查找表来说,采用插值查找,速度较快。
  2. 关键字分布不均匀的情况下,该方法不一定比二分法要好。

原文地址:https://www.toutiao.com/i6939142586317799968/

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 Java编程内功-数据结构与算法「二分查找非递归」 https://www.kuaiidc.com/111569.html

相关文章

发表评论
暂无评论