二分查找算法/折半查找算法(用Java实现)

 

package Exer;

/**
 * 二分查找:
 *  【必须是已经排序好的数组】
 * 时间复杂度:最好情况:O(logN)最坏情况下是:O((N))
 *步骤:
 * 先排序 再查找
 * target要查找的数
 * index:为target的下标
 * arr[]:待查找的数组
 */
public class BinarySeek {
    public static void swap(int []arr,int i,int j)
    {
        int tamp = arr[i];
        arr[i] = arr[j];
        arr[j] = tamp;
    }
    //这里我们用快速排序来排序,快速排序的相关说明已经在之前的文章中有说明
    public static void Sort(int []arr,int start,int end)
    {
        if(start < end)
        {
            int temp = arr[start];
            int low = start;
            int high = end + 1;
            while(true)
            {
                while(low < end && arr[++low] <= temp)
                    ;
                while(high > start && arr[--high] >= temp)
                    ;
                if(high > low)
                {
                    swap(arr,high,low);
                }
                else {
                    break;
                }
            }
            swap(arr,start,high);
            //调用递归,进行排序
            Sort(arr,start, high-1);
            Sort(arr,high+1,end);
        }
    }

    public static void Binary(int []arr,int start,int end)
    {
        int target = 100;//设置要查找的目标元素
        int index =-1;//将目标元素的下表先赋值为-1
        int counter = 0;//用作记循环的次数
        while(start <= end)
        {//进入循环,进行查找
            counter++;
            int mid = (start + end) /2 ;
            if(arr[mid]==target)
            {//如果找到,就将下标赋值给index,然后跳出循环
                index = mid;
                break;
            }
            else if(arr[mid] < target)
            {//如果中间元素小于目标元素,则缩小范围继续查找
                start = mid +1;
            }
            else if (arr[mid] >target)
            {//如果中间元素大于目标元素,则继续缩小范围进行查找
                end = mid -1;
            }
        }//当跳出循环时会出现两种情况,要么找到目标元素,跳出循环,要么找不到,循环结束。
        //因为index起始赋值为-1,所以当index不等于-1时,则说明找到指定元素
        if(index != -1)
        {
            System.out.println("二分查找的目标元素是: " + target + "\t" + "所在的索引位置是:" + index);
            System.out.println("查找次数是:" + counter);
        }//反之,index的值没变,还是-1,没找到
        else{
            System.out.println("没找到目标元素:" + target);
            System.out.println("查找次数是:" + counter);
        }
    }

    public static void main(String[] args) {
        //提前排好序
        int []arr = {12,12,3,-23,45,6,5,6,56,5,-545,45,53,-98,42,-6765,-68,0,5676};
        System.out.println("排序前:" + java.util.Arrays.toString(arr));
        Sort(arr,0,arr.length-1);
        System.out.println("排序后:" + java.util.Arrays.toString(arr));
        System.out.println("————进入二分法查找————");
        Binary(arr,0,arr.length-1);
    }
}

以上的排序方法是快速排序,快速排序的详解在之前的文章中有说明(点击下面连接即可)

http://t.csdn.cn/s4btdicon-default.png?t=M3C8http://t.csdn.cn/s4btd运行结果:

 

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen_5210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值