成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

 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算法線性

2018-06-15 14:26:42

2011-03-24 14:15:27

雙TOP二分法分頁

2021-10-19 09:59:25

二分法排序數組

2012-12-29 14:29:12

應屆畢業生求職

2011-01-10 14:41:26

2025-05-07 00:31:30

2011-05-03 15:59:00

黑盒打印機

2021-07-14 09:00:00

JavaFX開發應用

2010-05-27 10:10:07

職場經驗

2022-04-13 07:31:20

CAP定理分布式數據庫

2010-05-25 10:44:42

畢業生求職陷阱

2011-02-22 13:46:27

微軟SQL.NET

2021-02-26 11:54:38

MyBatis 插件接口

2021-12-28 08:38:26

Linux 中斷喚醒系統Linux 系統

2012-12-29 16:20:55

應屆畢業生求職

2023-04-26 12:46:43

DockerSpringKubernetes

2022-01-08 20:04:20

攔截系統調用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99久久精品国产一区二区三区 | 99re视频在线| 亚洲成人在线免费 | 久热中文字幕 | 在线免费视频一区 | 男人的天堂久久 | 国产精品久久久久久久久图文区 | 国产亚洲一区二区在线观看 | 中文字幕在线免费观看 | 国产精品一区在线 | 在线播放国产一区二区三区 | 国产日韩中文字幕 | 美女国内精品自产拍在线播放 | 亚洲午夜在线 | 成人亚洲精品 | 人人玩人人干 | 免费h视频| 6996成人影院网在线播放 | 精品亚洲一区二区三区四区五区 | 黄色大片在线视频 | 中文字幕人成乱码在线观看 | 五月天天色 | 理论片87福利理论电影 | 亚洲精品成人网 | 男女精品网站 | 久久最新精品视频 | 在线观看h视频 | 国产精品毛片无码 | 国产精品成人一区二区三区 | 中文字幕伊人 | 99pao成人国产永久免费视频 | 国产成人一区二区三区精 | www精品 | 成人性视频在线 | 嫩草最新网址 | 中文字幕成人网 | 国产精品久久久久久久久久 | 国产精品久久久久永久免费观看 | 国产.com | 国产有码| 午夜资源 |