笔者前几日荒废了学习,深感不安,故今日连续编码并整理发文,都是简单的东东,希望有能用得到的人!下面是个人总结,用语可能不够严谨,仅供参考!
二分排序法:
1.适用场景-->有序列
2.思想-->
每次取中间的数同目标数做比较,比目标数大,则需要向左边递归;比目标数小,则向右边递归;如果相等,则不执行递归,因为找到了目标元素;
3.实现-->
a.初始化递归应该包含左右边界,目标数,被查找序列四个入参;
b.取中间数,同目标数比较:
-->比目标数大,向左递归,左边界不变,右边界变为midIndex-1;
-->比目标数小,向右递归,右边界不变,左边界变为midIndex+1;
-->相等,不递归,直接输出目标数位置;
c.最重要的是,保证递归不死循环,要在b步骤的外层,加一个大的判断条件,即入参rightIndex>=leftIndex ;
特此说明:
此段代码用到笔者前些日的《Java实现排序》中的插入法排序类中的方法,因为二分法查找只适用有序列;
读者如想简单使用的话,可以直接初始化一个有序列,在主函数中直接调用bf.finding(0,length-1,val,arr)即可。
/**
* 演示二分法查找,调用Insertion类的排序方法
* Created by Light on 2014-7-27
*/
package com.second;
public class DoFinding {
public static void main(String[] args) {
// TODO Auto-generated method stub
//初始化数组
int arr[] = {0,9,3,5,2,7,6,4,1,8};
//int arr[] = {0,1,2,3,4,5,6,7,8,9};
//int arr[] = new int[0];
//int arr[] = new int[10];
//初始化数组,使用for循环
/*
for(int i=0;i<arr.length;i++)
{
arr[i] = (int)Math.random()*10;
}*/
//查找5
BinaryFind bf = new BinaryFind();
bf.actionFinding(arr, 5);
//bf.finding(0, 9, 7, arr);
}
}
//BinaryFind
class BinaryFind
{
public void finding(int leftIndex,int rightIndex,int val,int arr[])
{
//取中间数
int midIndex = (leftIndex + rightIndex)/2;
int midVal = arr[midIndex];
//comparsion
if(leftIndex<=rightIndex)
{
if(midVal>val)
{
finding(leftIndex,midIndex-1,val,arr);
}else if(midVal<val) {
finding(midIndex+1,rightIndex,val,arr);
}else if(midVal==val){
System.out.println("目标已找到,其下标为:"+midIndex+".给力吧!");
}
}else{
//在一次递归完成后,先判断一下是否会进入下一次递归,即leftIndex<=rightIndex是否为真,如果为假,则打印出查无此数.
System.out.println("查无此数!别浪费我感情!");
}
}
//外层封装
public void actionFinding(int arr[],int val)
{
if(arr.length-1>=0)
{
//先排序
Insertion ins = new Insertion();
ins.sort(arr);
ins.showArray(arr);
//再查找
finding(0,arr.length-1,val,arr);
}else{
System.out.println("此数组为空,无法查找!老大,你逗我呢?!");
}
}
}