java基礎-數組的折半查找原理
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
如果讓你寫一個數組的查找功能,需求如下:在一個數組中,找一個元素,是否存在於數組中, 如果存在就返回這個元素,如果沒有這個元素,就可以返回一個負數。今天我們來介紹一下折半查找的原理,並自己用代碼實現折半查找。
一.數組的折半查找原理
二分查找發,也叫折半查找,它的前提就是被查找的數組的元素,必須是有序(本篇博客數據案例均為升序)排列的。
1>.在查找前對數組進行折半操作 (初始化指針位置)
折半公式 = (最大索引+最小索引)/ 2
首先我們可以利用指針思想,假設有一個指針指向最大值(MAX),有一個指針指向最小值(MIN),還有一個指針指向的是最大值和最小值之間的索引(MID)。我把這個過程稱為初始化指針位置。
2>.折半后的指針索引和被查找元素比較。
若被查找元素的值(12)大於中間索引上的值(10),我們就把最小值指針(MIN)移動到中間指針(MID)索引的下一個索引位置,如下圖:
3>.若沒有匹配到就繼續折半后的指針索引和被查找元素比較。
若被查找元素的值(12)小於中間索引上的值(15),我們就把最大值指針(MAX)移動到中間指針(MID)索引的上一個索引位置,如下圖:
4>.若沒有匹配到就繼續折半后的指針索引和被查找元素比較。
若被查找元素的值(12)小於中間索引上的值(13),我們就把最大值指針(MAX)移動到中間指針(MID)索引的上一個索引位置,如下圖:
5>.若沒有匹配到就繼續折半后的指針索引和被查找元素比較。
當小指針(MIN)的索引(4)超過了大指針(MAX)的索引(3)時,就需要停止查找了,如果真有這種情況發生,說明沒有查到被查找元素的值(12),此時會返回一個負數(-1),當然如果查找到了就返回其在數組中的索引即可。
二.數組的折半查找代碼實現
1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.demo; 8 9 public class Demo { 10 11 public static void main(String[] args) { 12 int[] arr = {1,4,7,10,13,15,21,25}; 13 int index = binarySearch(arr,12); 14 System.out.println(index); 15 index = binarySearch(arr,7); 16 System.out.println(index); 17 } 18 19 public static int binarySearch(int[] arr,int key) { 20 //定義三個指針變量。 21 int min = 0; 22 int max = arr.length - 1; 23 int mid = 0; 24 //循環折半,條件, min<=max 25 while(min <= max) { 26 //公式,計算中間索引 27 mid = (min+max)/2; 28 //讓被找元素和中間索引元素進行比較 29 if(key>arr[mid]) { 30 min = mid +1; 31 }else if(key <arr[mid]) { 32 max = mid -1; 33 }else { 34 //找到元素,返回元素索引 35 return mid; 36 } 37 } 38 return -1; 39 } 40 } 41 42 43 /* 44 以上代碼執行結果如下: 45 -1 46 2 47 */

1 /* 2 @author :yinzhengjie 3 Blog:http://www.cnblogs.com/yinzhengjie/tag/Java%E5%9F%BA%E7%A1%80/ 4 EMAIL:y1053419035@qq.com 5 */ 6 7 package cn.org.yinzhengjie.note; 8 9 /* 10 * 二分查找 11 * 折半查找 12 * 前提:要找的數組必須是有序的. 13 * 每次都用中間的元素和要找的元素進行比較 14 * 15 */ 16 public class BinarySearchDemo { 17 18 public static void main(String[] args) { 19 int[] arr = {1,4,7,10,13,15,21,25}; 20 int index = binarySearch(arr,21); 21 //對返回值進行判斷 22 if(index == -1){ 23 System.out.println("no such element"); 24 }else{ 25 System.out.println("index is : " + index); 26 } 27 } 28 29 30 //自定義方法,折半查找 31 public static int binarySearch(int[] arr,int value){ 32 int min = 0; 33 int max = arr.length - 1; 34 int mid = (min + max) / 2; 35 while(true){ 36 //判斷要找的數落在左邊還是右邊 37 if(value > arr[mid]){ 38 min = mid + 1; 39 }else if(value < arr[mid]){ 40 max = mid - 1; 41 }else{ 42 return mid; 43 } 44 //重新計算中間的索引值 45 mid = (min + max) / 2; 46 //沒有找到的條件判斷 47 if(min > max){ 48 return -1; 49 } 50 } 51 } 52 } 53 54 55 /* 56 以上代碼執行結果如下: 57 index is : 6 58 */