二分查找+实例

目录

一、二分查找

二、实例 


一、二分查找

          二分查找,又叫折半查找(Binary Search),它是一种效率较高的查找方法。

           二分查找,要求序列必须  有序!!!

          原理:

  •   首先,序列中元素必须有序的,如果无序,则应该利用排序算法进行排序。
  •   然后 选取出 序列的 最小下标元素(min)、中间下标元素(mid)、最大下标元素(max)。   待查找数字(findNum)。(下面按 升序来理解)
  •  将序列中间位置的数据查找数据比较,如果两者相等,则查找成功否则利用中间位置数据  将序列分成前、后两个子序列。
  • 如果中间位置数据大于查找数据,则进一步查找前子序列,且max=mid-1
  • 如果中间位置数据小于查找数据,则进一步查找后子序列,且min=mid+1
  •  经过上面两个步骤,重新计算 mid = (min+max)/2  。然后 重复上面,中间数据与 查找数据的比较。
  •  结束条件,中间数据mid等于 查找数据 findNum(查找成功);或者min>max(查找失败)

二、实例 

       题目:对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找元素6 并输出排序后的下标。

         从题目要求来看,我们要利用二分查找 元素6 ,在排序后的下标位置。

        而二分查找,必须要求  序列有序,所以我们应该先对数组进行排序,本次题目利用了 冒泡排序法,对数组进行 升序排序。这一块,就不过多介绍了,想了解冒泡排序的小伙伴,可以去看博主前面的文章。链接为: 十大排序算法(绝对口语化的概念理解)

           下面,直接快进到 二分查找 算法的代码实现。

 //接着 开始 二分查找
        while(minIndex <= maxIndex) {     //当 最小下标 小于等于 最大下标时  ,循环继续
            if (nums[centerIndex] < findnum) {
                minIndex = centerIndex + 1 ;         //中间值 小于 查找值时,最小下标重置为 centerindex + 1
            }else if (nums[centerIndex] > findnum) {
                maxIndex = centerIndex - 1 ;         //中间值 大于 查找值时,最大下标重置为 centerindex - 1
            }else {
                System.out.println("查找成功,下标是:"+centerIndex);     //中间值 等于查找值 ,则输出 ”下标“
                break;
            }
            centerIndex = (maxIndex + minIndex) / 2;   //更新 中间下标
        }

         


 源码如下:

package task;

/**
 * 4、排序并查找
 * 对数组{1,3,9,5,6,7,15,4,8}进行排序,然后使用二分查找元素6 并输出排序后的下标。
 * @author Q
 */
public class Task_010104_002_04 {
    public static void main(String[] args) {
        int[] nums = {1,3,9,5,6,7,15,4,8};
        int maxIndex = nums.length;   //获取数组 最大下标
        int minIndex = 0;             //获取数组 最小下标
        int centerIndex = (maxIndex + minIndex) / 2 ;    //获取数组 中间下标
        int temp;
        int findnum = 6;
        // 首先进行 冒泡排序
        for (int i=0; i<nums.length-1; i++) {      //第一层循环
            for (int j=0; j<nums.length-i-1; j++) {    //第二层循环
                if (nums[j] > nums[j+1]) {
                    temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
        //输出排序后的 数组
        System.out.println("冒泡排序后,该数组排序为:");
        for (int i=0; i<nums.length; i++){
            System.out.print(nums[i]+"\t");
        }
        System.out.println("\n需要查找的数字为:"+findnum);

        //接着 开始 二分查找
        while(minIndex <= maxIndex) {     //当 最小下标 小于等于 最大下标时  ,循环继续
            if (nums[centerIndex] < findnum) {
                minIndex = centerIndex + 1 ;         //中间值 小于 查找值时,最小下标重置为 centerindex + 1
            }else if (nums[centerIndex] > findnum) {
                maxIndex = centerIndex - 1 ;         //中间值 大于 查找值时,最大下标重置为 centerindex - 1
            }else {
                System.out.println("查找成功,下标是:"+centerIndex);     //中间值 等于查找值 ,则输出 ”下标“
                break;
            }
            centerIndex = (maxIndex + minIndex) / 2;   //更新 中间下标
        }
    }
}

 


结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

新计划

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

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

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

打赏作者

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

抵扣说明:

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

余额充值