java基礎-數組的折半查找原理


                  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 */
另一種二分法查找的實現方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM