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 }

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15786.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论