当前位置:   article > 正文

二分查找(Java实现)_二分查找法编写程序。输入一个整数,用“二分法”在有序的数据集{46,52,68,71,74,8

二分查找法编写程序。输入一个整数,用“二分法”在有序的数据集{46,52,68,71,74,8

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

在我学习过程中,遇到了二分查找的相关问题,所以想简单记录一下:

首先,必须说明一下,二分查找只适用于已经排好序的顺序序列,假如现在顺序没有排好,可以使用Arrays类的sort方法,默认排序为升序序列:

  1. int[] arr1 = {10,2,3,8,6,12};
  2. Arrays.sort(arr1);
  3. System.out.println(Arrays.toString(arr1));

输出结果:[2, 3, 6, 8, 10, 12] 

这时已经排好序了,这是实现二分查找的前提

二分查找的实现方法:

(1)使用API:Arrays类的binarySearch方法

(2)迭代方式

(3)递归方式

 

方法一:Arrays类的binarySearch方法

  1. public static void main(String[] args) {
  2. int[] arr = {1, 10, 23, 35, 55, 66, 88};
  3. //二分查找
  4. int index1 = Arrays.binarySearch(arr,66);
  5. int index2 = Arrays.binarySearch(arr,18);
  6. //如果需要查找的数据存在,就返回数组中对应数据的下标值,
  7. // 如果不存在,返回值为: -(应该插入的位置索引+1)
  8. System.out.println(index1);
  9. System.out.println(index2);
  10. }
输出结果:5  -3

需要注意:如果需要查找的数据存在,就返回数组中对应数据的下标值,

如果不存在,返回值为:   -(应该插入的位置索引+1)       

方法二:迭代方式

  1. public static void main(String[] args) {
  2. //定义一个数组
  3. int[] arr = {10,14,16,25,28,30,35,88,100};
  4. int index =binarySearch(arr,100);
  5. System.out.println(index);
  6. }
  7. /**
  8. * @param arr 已排序的数组
  9. * @param data 要找的数据
  10. * @return 索引,如果元素不存在,直接返回-1
  11. */
  12. public static int binarySearch(int[] arr,int data){
  13. int low = 0;
  14. int high = arr.length-1;
  15. while (low <= high){
  16. int mid = (low + high)/2;
  17. if (arr[mid] < data){
  18. low = mid+1;
  19. }else if (arr[mid] > data){
  20. high = mid -1;
  21. }else if (arr[mid] == data)
  22. return mid;
  23. }
  24. return -1;
  25. }

 输出结果:8

方法三:递归方法

  1. public static void main(String[] args) {
  2. int[] arr = {10,14,16,25,28,30,35,88,100};
  3. int index =binarySearch1(arr,16,0,arr.length-1);
  4. System.out.println(index);
  5. }
  6. /**
  7. *
  8. * @param arr 已排序的数组
  9. * @param data 要找的数据
  10. * @param low 左侧初始位置规定为0
  11. * @param high 右侧初始位置规定为数组长度-1
  12. * @return 索引,如果元素不存在,直接返回-1
  13. */
  14. public static int binarySearch1(int[] arr,int data,int low,int high){
  15. if (low > high)
  16. return -1;
  17. int mid = (low + high)/2;
  18. if (arr[mid] == data)
  19. return mid;
  20. else if (arr[mid] > data)
  21. return binarySearch1(arr,data,low,mid-1);
  22. else
  23. return binarySearch1(arr,data,mid+1,high);
  24. }

输出结果:2

 以上部分对大部分数组来说的,已经可以满足要求了,但是还可能会遇到边界值问题,这里我说一下:

边界值问题:

假设我们有一个有序数组{10,14,16,16,16,16,16,88,100},数组中出现了多个大小相同的数据16,这些相同数据的最右边的元素,即index值最大的为上边界,索引为6,;这些相同数据的最左边元素,即index值最小的为下边界,索引为2;传入需要查找的数据16,在数组中可以找到就返回索引,找不到就返回-1。那么这样的数组我们应该如何取得上边界和下边界索引值呢?

 求上边界:

  1. public static void main(String[] args) {
  2. int[] arr = {10,14,16,16,16,16,16,88,100};
  3. int index2 =upperBinarySearch(arr,16);
  4. System.out.println(index2);
  5. }
  6. public static int upperBinarySearch(int[] arr,int data){
  7. int low = 0;
  8. int height = arr.length;
  9. int item = -1;
  10. while (low < height){
  11. int mid = (low + height)/2;
  12. if (data == arr[mid]){
  13. item = mid;
  14. low = mid+1;
  15. }else if (data < arr[mid]){
  16. height = mid;
  17. }else if (data > arr[mid]){
  18. low = mid + 1;
  19. }
  20. }
  21. return item;
  22. }

输出结果:6

 求下边界:

  1. public static void main(String[] args) {
  2. int[] arr = {10,14,16,16,16,16,16,88,100};
  3. int index1 =lowerBinarySearch(arr,16);
  4. System.out.println(index1);
  5. }
  6. public static int lowerBinarySearch(int[] arr,int data){
  7. int low = 0;
  8. int height = arr.length;
  9. int item = -1;
  10. while (low < height){
  11. int mid = (low + height)/2;
  12. if (data == arr[mid]){
  13. item = mid;
  14. height = mid;
  15. }else if (data < arr[mid]){
  16. height = mid;
  17. }else if (data > arr[mid]){
  18. low = mid + 1;
  19. }
  20. }
  21. return item;
  22. }

输出结果:2 

以上只是我个人对于该知识的理解,如果有出现错误的地方, 请大神指正,虚心接受,争取越来越好,如果觉得不错,欢迎点赞收藏谢谢。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/977687
推荐阅读
相关标签
  

闽ICP备14008679号