Java實現二分法排序


二分法:(二分法不是只能做數組,這里的數組只是為了舉例)

在給出的有序排列的數組中,把目標值和數組中間值進行比較,如果相等,則返回中間值下標,如果目標值小於中間值,就從數組的前半段再次執行二分法查找,如果目標值大於中間值,從數組的后半段開始二分法查找

二分法查找主要是比較的次數少,查找的速度快,平均性能好,但是待查表一定要是有序的,插入刪除比較困難,所以二分法查找不適用於經常變動的有序列表.

上代碼:

 1 package cn.summerchill.sort;
 2 
 3 public class BinarySearch {
 4     public static void main(String[] args) {
 5         //有序排列數組(大到小,小到大無所謂)
 6         int[] array = {1,2,3,4,5,6,7,8,9,10};
 7         //打印二分法的返回值
 8         System.out.println(searchRecursive(array,0,array.length-1,9));
 9     }
10     public static int searchRecursive(int[] array,int start,int end,int findValue){
11         if(array==null){
12             return -1;
13         }
14         if(start<=end){
15             //中間位置
16             int middle = (start + end)/2;
17             //中值
18             int middleValue = array[middle];
19             if(findValue == middleValue){
20                 //與中值相等就直接返回
21                 //return middle;
22                 return middleValue;
23             }else if(findValue < middleValue){
24                 //目標值小於中值,在中值前面找(這里調用了二分法的方法)
25                 return searchRecursive(array,start,middle - 1,findValue);
26             }else {
27                 //目標值大於中值,在中值后面找(這里調用了二分法的方法)
28                 return searchRecursive(array,middle + 1,end,findValue);
29             }
30         }else{
31             //返回-1,查找失敗
32             return -1;
33         }
34     }    
35 }

 ======================2017-10-22晚添加========

自己寫二分法:

 1 public class BinarySearch {
 2     public static void main(String[] args) {
 3         Integer arr[] = { 1, 2, 4, 6, 8, 11, 23 };
 4         binarySearch(arr,0,arr.length - 1, 23);
 5     }
 6     public  static void binarySearch(Integer[] arr,int start, int end, int num){
 7         if(arr != null && arr.length > 0){
 8             int middle = (end + start) / 2;
 9             //中間的值大於目標值
10             /*
11              一開始我處理的方式是 end = middle; start = middle 
12              這樣在查找最后一個元素的時候容易造成棧溢出 StackOverFlow
13             因為查找最后一個元素的時候 (index-1  + index)/2 永遠比index 小,找不到最后一個元素
14             需要對 end - start == 1 做一個單獨的判斷.
15             但是如果 end = middle -1 ; start = middle + 1 這種形式就沒有問題了.
16              */
17             if(arr[middle] > num){
18                 end = middle - 1;
19                 binarySearch(arr, start, end, num);
20             }else if(arr[middle] < num){//中間的值小於目標值
21                 start = middle + 1;
22                 binarySearch(arr, start, end, num);
23             }else{//和中間的值相等
24                 System.out.println("找到對應的值,值為:" + num);
25             }
26         }
27     }
28 }

 


免責聲明!

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



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