国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

畢業生求職必會算法手把手教你二分法查找

開發 前端 算法
當數組或者集合中存放的元素數量非常多的時候,想要跟蹤具體某個元素的位置或者是否存在,常規方式是循環每一個元素直到找到要查找的元素為止。這樣的查找方式效率非常低下,這個時候需要使用二分法來實現,提高查找效率。

 1、二分法查找的背景

當數組或者集合中存放的元素數量非常多的時候,想要跟蹤具體某個元素的位置或者是否存在,常規方式是循環每一個元素直到找到要查找的元素為止。這樣的查找方式效率非常低下,這個時候需要使用二分法來實現,提高查找效率。

2、二分法查找的介紹

二分法查找(折半查找),找指定數值所在的位置

百度百科是這樣介紹二分法查找的:


3、二分法查找的算法思想

假設數組是按升序排序的,對于給定的目標值aim,從數組的中間位置開始查找:1.若查找數據與中間元素值正好相等,則返回中間元素值的索引;2.若查找數值比中間值小,則以整個查找范圍的前半部分作為新的查找范圍;3.若查找數值比中間值大,則以整個查找范圍的后半部分作為新的查找范圍;注:查找成功返回索引,失敗返回-1

4、代碼實現

4.1 利用循環的方式實現二分法查找

  1. public class BinarySearch { 
  2.     public static void main(String[] args) { 
  3.         // 生成一個隨機數組 
  4.         int[] array = suiji(); 
  5.         // 對隨機數組排序 
  6.         Arrays.sort(array); 
  7.         System.out.println("產生的隨機數組為: " + Arrays.toString(array)); 
  8.  
  9.         System.out.println("要進行查找的值: "); 
  10.         Scanner input = new Scanner(System.in); 
  11.         // 進行查找的目標值 
  12.         int aim = input.nextInt(); 
  13.  
  14.         // 使用二分法查找 
  15.         int index = binarySearch(array, aim); 
  16.         System.out.println("查找的值的索引位置: " + index); 
  17.  
  18.     } 
  19.  
  20.     /** 
  21.      * 生成一個隨機數組 
  22.      *  
  23.      * @return 返回值,返回一個隨機數組 
  24.      */ 
  25.     private static int[] suiji() { 
  26.         // random.nextInt(n)+m  返回m到m+n-1之間的隨機數 
  27.         int n = new Random().nextInt(6) + 5; 
  28.         int[] array = new int[n]; 
  29.         // 循環遍歷為數組賦值 
  30.         for (int i = 0; i < array.length; i++) { 
  31.             array[i] = new Random().nextInt(100); 
  32.         } 
  33.         return array; 
  34.     } 
  35.  
  36.     /** 
  37.      * 二分法查找  ---循環的方式實現 
  38.      *  
  39.      * @param array 要查找的數組 
  40.      * @param aim 要查找的值 
  41.      * @return 返回值,成功返回索引,失敗返回-1 
  42.      */ 
  43.     private static int binarySearch(int[] array, int aim) { 
  44.         // 數組最小索引值 
  45.         int left = 0; 
  46.         // 數組最大索引值 
  47.         int right = array.length - 1; 
  48.         int mid; 
  49.         while (left <= right) { 
  50.             mid = (left + right) / 2; 
  51.             // 若查找數值比中間值小,則以整個查找范圍的前半部分作為新的查找范圍 
  52.             if (aim < array[mid]) { 
  53.                 right = mid - 1; 
  54.                 // 若查找數值比中間值大,則以整個查找范圍的后半部分作為新的查找范圍 
  55.             } else if (aim > array[mid]) { 
  56.                 left = mid + 1; 
  57.                 // 若查找數據與中間元素值正好相等,則放回中間元素值的索引 
  58.             } else { 
  59.                 return mid; 
  60.             } 
  61.         } 
  62.         return -1; 
  63.     } 

代碼執行結果:

  1. 產生的隨機數組為: [16, 33, 40, 46, 57, 63, 65, 71, 85] 
  2. 要進行查找的值:  
  3. 46 
  4. 查找的值的索引位置: 3 

若輸入的值找不到,則返回-1

  1. 產生的隨機數組為: [28, 41, 47, 56, 70, 81, 85, 88, 95] 
  2. 要進行查找的值:  
  3. 66 
  4. 查找的值的索引位置: -1 

4.2 利用遞歸的方式實現二分法查找

  1. public class BinarySearch2 { 
  2.     public static void main(String[] args) { 
  3.         // 生成一個隨機數組 
  4.         int[] array = suiji(); 
  5.         // 對隨機數組排序 
  6.         Arrays.sort(array); 
  7.         System.out.println("產生的隨機數組為: " + Arrays.toString(array)); 
  8.  
  9.         System.out.println("要進行查找的值: "); 
  10.         Scanner input = new Scanner(System.in); 
  11.         // 進行查找的目標值 
  12.         int aim = input.nextInt(); 
  13.  
  14.         // 使用二分法查找 
  15.         int index = binarySearch(array, aim, 0, array.length - 1); 
  16.         System.out.println("查找的值的索引位置: " + index); 
  17.     } 
  18.  
  19.     /** 
  20.      * 生成一個隨機數組 
  21.      * 
  22.      * @return 返回值,返回一個隨機數組 
  23.      */ 
  24.     private static int[] suiji() { 
  25.         // Random.nextInt(n)+m  返回m到m+n-1之間的隨機數 
  26.         int n = new Random().nextInt(6) + 5; 
  27.         int[] array = new int[n]; 
  28.         // 循環遍歷為數組賦值 
  29.         for (int i = 0; i < array.length; i++) { 
  30.             array[i] = new Random().nextInt(100); 
  31.         } 
  32.         return array; 
  33.     } 
  34.  
  35.     /** 
  36.      * 二分法查找 ---遞歸的方式 
  37.      * 
  38.      * @param array 要查找的數組 
  39.      * @param aim   要查找的值 
  40.      * @param left  左邊最小值 
  41.      * @param right 右邊最大值 
  42.      * @return 返回值,成功返回索引,失敗返回-1 
  43.      */ 
  44.     private static int binarySearch(int[] array, int aim, int leftint right) { 
  45.         if (aim < array[left] || aim > array[right]) { 
  46.             return -1; 
  47.         } 
  48.         // 找中間值 
  49.         int mid = (left + right) / 2; 
  50.         if (array[mid] == aim) { 
  51.             return mid; 
  52.         } else if (array[mid] > aim) { 
  53.             //如果中間值大于要找的值則從左邊一半繼續遞歸 
  54.             return binarySearch(array, aim, left, mid - 1); 
  55.         } else { 
  56.             //如果中間值小于要找的值則從右邊一半繼續遞歸 
  57.             return binarySearch(array, aim, mid + 1, array.length-1); 
  58.         } 
  59.     } 

遞歸相較于循環,代碼比較簡潔,但是時間和空間消耗比較大,效率低。在實際的學習與工作中,根據情況選擇使用。

 

責任編輯:姜華 來源: 程序猿編程
相關推薦

2023-12-27 23:30:50

2021-12-26 00:10:39

二分法排查版本

2021-12-11 20:20:19

Python算法線性

2011-03-24 14:15:27

雙TOP二分法分頁

2018-06-15 14:26:42

2021-10-19 09:59:25

二分法排序數組

2012-12-29 14:29:12

應屆畢業生求職

2022-04-13 07:31:20

CAP定理分布式數據庫

2021-07-14 09:00:00

JavaFX開發應用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機

2025-05-07 00:31:30

2010-05-25 10:44:42

畢業生求職陷阱

2010-05-27 10:10:07

職場經驗

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

2022-07-27 08:16:22

搜索引擎Lucene

2022-03-14 14:47:21

HarmonyOS操作系統鴻蒙

2022-01-08 20:04:20

攔截系統調用

2011-02-22 13:46:27

微軟SQL.NET
點贊
收藏

51CTO技術棧公眾號

国产亚洲精品美女| 欧洲一区二区在线| 国产精品一区免费在线 | 欧美暴力调教| 日韩精品中文字幕在线| 免费在线看电影| 欧美日韩成人综合天天影院| 日本电影亚洲天堂一区| 91网在线观看| 亚洲国产精品久久艾草纯爱| 捆绑紧缚一区二区三区在线观看| 中文字幕一区二区三区四区不卡 | 2024亚洲男人天堂| 香蕉免费一区二区三区在线观看| 欧美www在线| 国产一级成人av| 久久久影视精品| 成人免费电影网址| 国产高清自拍一区| 久久国产福利| 四虎永久免费网站| 成人在线综合网| 另类图片亚洲色图| 精品久久久久久久久久久久久久 | 久久这里精品| 婷婷精品在线观看| 亚洲国产日韩综合久久精品| 色婷婷av一区二区三区在线观看| av中文在线资源库| 中文字幕亚洲专区| 猫咪成人在线观看| 51精品国产人成在线观看| 激情综合在线| 国产免费xxx| 国产日韩欧美精品综合| 国产免费福利| 丁香六月激情婷婷| 精品久久久久一区| av一区二区在线观看| 超碰影院在线观看| 国产模特精品视频久久久久| 午夜精品区一区二区三| 粉嫩蜜臀av国产精品网站| 成人网址大全| 精品视频在线免费| 欧美xxxx性| 国产精品久久一区| 久久精品三级| 美女网站视频黄色| 日韩欧美一区二区三区在线观看 | 欧美亚洲另类视频| 国产精品精品国产一区二区| 好吊妞www.84com只有这里才有精品| 欧美精品一区二区三区中文字幕| 91中文字幕在线| 欧美影院三区| 欧美极品jizzhd欧美| 久热成人在线视频| 亚洲欧美精品在线观看| 亚洲欧美日韩视频二区| 欧美精品中文字幕一区二区| 国产剧情一区| 国产一区二中文字幕在线看| 中文字幕一区二区三区精华液| 成人网18入口| 亚洲美女激情视频| 国产精品中文| 亚洲欧美日韩在线一区| 国产白丝网站精品污在线入口| 精品日韩久久久| 欧美在线视频不卡| 日韩精品一区二区三区中文在线| 91精品网站| 久久久久国产成人精品亚洲午夜 | 91精品国产综合久久久久久豆腐| 久久激情视频免费观看| av不卡在线| 日本一二区视频| 亚洲午夜国产成人av电影男同| 欧美欧美天天天天操| 日韩精品视频一二三| 亚洲欧美变态国产另类| 99热免费精品| 欧美13~18sex性hd| 久久视频在线免费观看| 日本美女一区二区三区视频| 欧美精品久久久久久久久久丰满| 久久久久国产视频| 国产成人免费视频| 五月花成人网| 国产美女99p| 欧美日韩中国免费专区在线看| 欧美专区视频| 亚洲一区bb| 蜜桃av噜噜一区二区三| 欧美日韩国产成人精品| www.亚洲| 欧美成人亚洲成人| 国产精品一级黄| 午夜dj在线观看高清视频完整版| 亚洲一区二区三区xxx视频| 中文字幕在线观看不卡| 高清亚洲高清| 天天综合天天做天天综合| 欧美性猛交xxxx乱大交极品| 中文字幕日韩高清| 日本免费高清一区二区| 亚洲一区在线观看网站| 日本精品视频| 欧美视频免费看欧美视频| 日韩欧美自拍偷拍| 亚洲私人影院| 国产高清视频在线播放| 成人精品久久av网站| 亚洲精品一二三| 人妖一区二区三区| 91福利免费在线| 奇米4444一区二区三区| 国产精品国模大尺度视频| 亚洲日本va| 97在线资源在| 影音先锋亚洲一区| 亚洲日本欧美天堂| 精品在线观看一区二区| 欧美日韩中字一区| 国色天香一区二区| 一区二区亚洲精品国产| 性xxxxfjsxxxxx欧美| 国产成人看片| 精品国产一区二区三区免费 | 日本三级视频在线播放| 欧美巨大黑人极品精男| 久久综合狠狠综合久久激情| 欧美freesex| 亚洲 高清 成人 动漫| 亚洲香蕉伊综合在人在线视看 | 欧美国产二区| 黄色成人av网| 久久精品成人| 99在线观看免费视频精品观看| 成人av手机在线观看| 国内精品伊人久久久久av一坑| 欧美激情91| 久久婷婷影院| 欧美二区不卡| 天堂男人av| 国产精品久久久久久久7电影| 欧美日韩午夜精品| 亚洲欧美另类图片小说| 伊人久久成人| 在线日韩三级| 超污网站在线观看| 日韩网站免费观看高清| 蜜桃久久av| 日韩在线视频精品| 欧美成人一区在线观看| 亚洲精品欧美| 国产精品国产三级国产a| 精品黑人一区二区三区久久| 欧美精品福利视频| 午夜久久资源| a级黄色片网站| 国产高清精品网站| 国产午夜精品一区在线观看| 欧美激情极品| 蜜桃av一区二区三区| 国产精品理论片在线观看| 3d动漫精品啪啪| 68精品久久久久久欧美| 日韩欧美国产二区| 男女视频网站免费观看| 欧美成人精品三级网站| 国产精品黄色| 国产精品嫩草久久久久| 亚洲成人久久网| 成人网址在线观看| 毛片av免费在线观看| av小说在线播放| 伊人久久亚洲影院| 亚洲午夜电影网| 九九精品视频在线观看| 黄色网址在线免费看| 国产最新在线| 99成人免费视频| 色天使色偷偷av一区二区| 精品国产一二三| 欧美男同性恋视频网站| 日韩精品一区二区三区在线观看| 亚洲女同女同女同女同女同69| 中文字幕亚洲综合久久菠萝蜜| fc2成人免费人成在线观看播放 | 欧美精品黄色| av网站在线播放| 亚洲少妇中文在线| 日韩在线导航| 国产精品二线| 精品国产黄a∨片高清在线| av超碰免费在线| 任你躁在线精品免费| 亚洲综合日本|