目录
一、二分查找
二分查找,又叫折半查找(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; //更新 中间下标 } } }
结果如下: