自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

畢業(yè)生求職必會(huì)算法手把手教你二分法查找

開發(fā) 前端 算法
當(dāng)數(shù)組或者集合中存放的元素?cái)?shù)量非常多的時(shí)候,想要跟蹤具體某個(gè)元素的位置或者是否存在,常規(guī)方式是循環(huán)每一個(gè)元素直到找到要查找的元素為止。這樣的查找方式效率非常低下,這個(gè)時(shí)候需要使用二分法來實(shí)現(xiàn),提高查找效率。

 1、二分法查找的背景

當(dāng)數(shù)組或者集合中存放的元素?cái)?shù)量非常多的時(shí)候,想要跟蹤具體某個(gè)元素的位置或者是否存在,常規(guī)方式是循環(huán)每一個(gè)元素直到找到要查找的元素為止。這樣的查找方式效率非常低下,這個(gè)時(shí)候需要使用二分法來實(shí)現(xiàn),提高查找效率。

2、二分法查找的介紹

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

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


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

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

4、代碼實(shí)現(xiàn)

4.1 利用循環(huán)的方式實(shí)現(xiàn)二分法查找

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

代碼執(zhí)行結(jié)果:

  1. 產(chǎn)生的隨機(jī)數(shù)組為: [16, 33, 40, 46, 57, 63, 65, 71, 85] 
  2. 要進(jìn)行查找的值:  
  3. 46 
  4. 查找的值的索引位置: 3 

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

  1. 產(chǎn)生的隨機(jī)數(shù)組為: [28, 41, 47, 56, 70, 81, 85, 88, 95] 
  2. 要進(jìn)行查找的值:  
  3. 66 
  4. 查找的值的索引位置: -1 

4.2 利用遞歸的方式實(shí)現(xiàn)二分法查找

  1. public class BinarySearch2 { 
  2.     public static void main(String[] args) { 
  3.         // 生成一個(gè)隨機(jī)數(shù)組 
  4.         int[] array = suiji(); 
  5.         // 對(duì)隨機(jī)數(shù)組排序 
  6.         Arrays.sort(array); 
  7.         System.out.println("產(chǎn)生的隨機(jī)數(shù)組為: " + Arrays.toString(array)); 
  8.  
  9.         System.out.println("要進(jìn)行查找的值: "); 
  10.         Scanner input = new Scanner(System.in); 
  11.         // 進(jìn)行查找的目標(biāo)值 
  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.      * 生成一個(gè)隨機(jī)數(shù)組 
  21.      * 
  22.      * @return 返回值,返回一個(gè)隨機(jī)數(shù)組 
  23.      */ 
  24.     private static int[] suiji() { 
  25.         // Random.nextInt(n)+m  返回m到m+n-1之間的隨機(jī)數(shù) 
  26.         int n = new Random().nextInt(6) + 5; 
  27.         int[] array = new int[n]; 
  28.         // 循環(huán)遍歷為數(shù)組賦值 
  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 要查找的數(shù)組 
  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.             //如果中間值大于要找的值則從左邊一半繼續(xù)遞歸 
  54.             return binarySearch(array, aim, left, mid - 1); 
  55.         } else { 
  56.             //如果中間值小于要找的值則從右邊一半繼續(xù)遞歸 
  57.             return binarySearch(array, aim, mid + 1, array.length-1); 
  58.         } 
  59.     } 

遞歸相較于循環(huán),代碼比較簡(jiǎn)潔,但是時(shí)間和空間消耗比較大,效率低。在實(shí)際的學(xué)習(xí)與工作中,根據(jù)情況選擇使用。

 

責(zé)任編輯:姜華 來源: 程序猿編程
相關(guān)推薦

2023-12-27 23:30:50

2021-12-26 00:10:39

二分法排查版本

2018-06-15 14:26:42

2021-12-11 20:20:19

Python算法線性

2011-03-24 14:15:27

雙TOP二分法分頁(yè)

2021-10-19 09:59:25

二分法排序數(shù)組

2012-12-29 14:29:12

應(yīng)屆畢業(yè)生求職

2022-04-13 07:31:20

CAP定理分布式數(shù)據(jù)庫(kù)

2010-05-25 10:44:42

畢業(yè)生求職陷阱

2021-07-14 09:00:00

JavaFX開發(fā)應(yīng)用

2011-01-10 14:41:26

2011-05-03 15:59:00

黑盒打印機(jī)

2010-05-27 10:10:07

職場(chǎng)經(jīng)驗(yàn)

2017-12-19 15:54:28

工作流Git二分法

2021-02-26 11:54:38

MyBatis 插件接口

2011-02-22 13:46:27

微軟SQL.NET

2021-12-28 08:38:26

Linux 中斷喚醒系統(tǒng)Linux 系統(tǒng)

2022-01-08 20:04:20

攔截系統(tǒng)調(diào)用

2023-04-26 12:46:43

DockerSpringKubernetes

2022-12-07 08:42:35

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)