自己写二分法……(普通循环和运用递归思想)

 

(1)递归思想实现元素的二分法查找

package org.media;

import java.util.Arrays;

public class GoTest{

public static void main(String args[]){

int a[]={0,1,9,5,7};

Arrays.sort(a);

System.out.println(binSearch(a,0,a.length-2,5));

}

 public static int binSearch(int a[], int start, int end, int key) {   

  

        int mid = (end - start) / 2 + start;   

        

        if (a[mid] == key) {   

            return mid;   

        }   

        if (start >= end) {   

            return -1;   

        } else if (key>a[mid]) {   

            return binSearch(a, mid + 1, end, key);   

        } else if (key<a[mid]) {   

            return binSearch(a, start, mid - 1, key);   

        }   

        return -1;   

    }  

}

//在上面的算法中必须保证元素是按照升序排列的。

int min(end-start)/2+start;

得到中间位置的索引,将中间位置索引对应的元素与要查找的元素key进行比较。

如果索引位置的对应值正好等于key的值。则返回中间位置的索引即为查找的元素的索引。

如果key的值大于中间位置的值,也就是说key的值在中间位置的“后半部分”(升序排列)这时再将原来的中间位置向后挪动一位变为重新 折半分的 起始索引位置。终止索引位置不变,再进行查找key的值。若是key的值再大于重新确定的mid的值,再重复上面操作,如此递归……

如果key的值小于中间位置的值,也就是说key的值在中间位置的“前半部分”,这时再将原来的中间位置向前挪动一位变为重新 折半分的 终止位置。……同样也是这样递归。

当起始位置的索引大于或等于终止未指定的索引时,返回 -1 表示错误。

mid的值为小数时,取小于它的最大整数作为中间位置。

(1)普通循环实现二分法查找

package org.media;

import java.util.Arrays;

public class GoTest{

public static void main(String args[]){

int a[]={9,7,6,5,2};

Arrays.sort(a);

System.out.println(binSearch(a,9));

}

public static int binSearch(int array[],int key){

int mid=array.length/2;

int start =0;

int end=array.length-1;

if(key==array[mid])

return mid;

while(start<=end){

mid=(end-start)/2+start;

if(key <array[mid]){

end=mid-1;

}else if(key >array[mid]){

start=mid+1;

}else{

return mid;

}

}

return -1;

}

}

//在使用二分法之前需要对元素进行升序排列
传递一个数组和要查找的元素调用binSearch()方法。

同样取得数组的中间位置作为比较的起始位置。

先将值遇arrray[mid]进行比较,当二者相等的时候,返回mid的位置即为查找的值的索引。使用start<=end作为条件进行循环。当值小于当前的array[mid]时,当前mid的索引值前移一位,因为key的值在mid的前面。

……同样的思想分析当key>=array[mid]也是合理的。

当不符合要求(没有按照升序或start>end)时,就会返回 -1 

你可能感兴趣的:(算法)